Всем привет!)
Сегодня состоится очередной раунд Codeforces #205 для участников из 2 дивизиона. Традиционно, участники 1 дивизиона могут написать соревнование вне конкурса.
Подготовкой задач занимались Игорь Кудряшов (Igor_Kudryashov) и Геральд Агапов (Gerald). Кроме того, выражаем благодарность Михаилу Мирзаянову (MikeMirzayanov) за прекрасный ресурс Codeforces и Марии Беловой (Delinur) за перевод условий задач на английский язык.
Желаем всем участникам удачи, высокого рейтинга и удовольствия от решения задач)
UPD: В раунде будет использована динамическая система оценки задач.
UPD 2: Соревнование завершено, благодарим всех за участие.
Поздравляем победителей:
UPD 3: Разбор задач можно найти здесь
жалко, что без див 1 :(
ну так в чем проблема?
Просто начни решать не с А, а с С, D, Е и посмотри как отрешаешь.
Зато можно просто потренироваться.Это лишним не будет.
I will participate.
THANK YOU! We are delighted to hear that.
will the scoring system be static or dynamic?
It will be determined soon)
deleted.
So?
there are only 5 minutes left for the round to start, please publish the scoring system asap!
UPD: it is now published, and it is dynamic system!
Next Round is on Sunday. Awesome!!!
Желаю всем повыситься в рейтинге.
Спасибо, конечно, но все в рейтинге не повысятся. Кто-то обязательно упадёт
Если при отправке решения я перепутал её название: хотел отправить решение А, отправил, как С, и получил штраф в 50 баллов, его (штраф) можно как-нибудь предотвратить?
Вы не получили штраф, т.к. неправильный ответ на тесте 1 не считается за посылку.
Спасибо. Конечно я могу ошибаться, но мне казалось, что изначально мне за задачу А дали 442 балла, после чего я попытался её переотправить (дабы улучшить решение) и перепутал А и С, и, наконец, ещё раз переотправил уже нормально, и добился своего. Правильно я понимаю, что штраф за это должен составить 50? (Однако балл уменьшился на 100)
да, штраф за это составляет 50, но Ваш балл уменьшился на 100 из-за того, что с момента первой посылки прошло некоторое время, и стоимость задачи упала
Половина решений участников по задаче В посыпалась на 6-м претесте...)
Какой он коварный!
К примеру, именно на 6 тесте падают решения, которые не учитывают тот факт, что кучки должны быть равного размера.
что? Равного размера??? я идиот...
Прописано же,что из кучки с 2*n фишек выбирается n фишек в первую, остальное — во вторую кучу.
я прочитал, как "выбирается первая произвольно".
У Валеры имеется 2·n кубиков, на каждом из которых записано целое число от 10 до 99. Он произвольным образом выбирает n кубиков и откладывает в первую кучку. Оставшиеся кубики образуют вторую кучку.
В моем коде априори не может быть разное количество в кучках. Поэтому я до сих пор не понял, на чём она упала.
4
10 10 20 20 10 12 20 11
Ответ:
9
1 2 1 2 1 1 2 2
9
1 2 2 1 1 1 2 2
Лично у меня падала на этом. Системные тесты прошла.
The worst round I've ever performed. Sad... T_T
На чём ломали А? Что-то всю комнату посмотрел, ни на что не обратил внимания:o
Меня поймали на тесте типа:
2
7 1 2 4
Моя программа выдала бы 1.
меня на 1 3 3
Одинаковая чётность половин доминошек. Например,
Does anyone know what B — test case 6 is about?
People say, that your programm could fall down because of different count of bones on both bags.
try this
9
1 2 2 2 3 4 4 4 5 6 6 6 7 8 8 8 9 10
Try this: 4 99 89 88 98 89 88 89 88 This should give 9 as answer
Well:
9
2 2 1 1 1 2 2 1
There's one apparent reason that contributed to B being as hard as it was: the answer is (number of different numbers in first half)*(in second half); if there's a number occuring at least 2 times in the input, we should choose one copy of it to each half, and for the remaining numbers (occuring once), we could put them into both halves in any way (then, we complete the halves by putting the remaining copies of the numbers occuring at least thrice, and it doesn't matter how we do that).
But since we want the answer to be as large as possible, we need to put half of those once occuring numbers to one half ad the other half to the other — the answer is (x + a)(x + b), when there are x numbers occuring at least twice in the input and a + b occuring once, and that expression increases as |a - b| decreases. Proof by taking the zero of the derivative (when we allow ).
I struggle if you mean (x + a)(x + b) & that expression increases as |a - b| decreases.
Yeah, that's what I meant. I wrote it in a hurry, so typos are inevitable :D
Excuse me, does that mean that if we just sort the numbers and then in a sorted array will put all the odd indexed elements in one heap and all even indexed in another and just count the number of different pairs, since n is not big, we have a correct solution?
No. It fails on the array "1 2 2 2 3 4 4 4" — you put 1 and 3 in the same heap (answer=8), but you should put 1 in one heap and 3 in the other (answer=9).
But if you try this approach separately on once occuring elements and separately on multiple times occuring ones, it works.
Yeah, now I see. Thank you very much! :-)
consider:
1 2 2 2 3 4 4 4
you'll get
8
1 2 1 2 1 2 1 2
while correct answer is
9
1 1 2 2 2 2 1 1
Thank you!
special judge
That is the 6th system test, which falls down my prog till now:
50
49 13 81 20 73 62 19 49 65 95 32 84 24 96 51 57 53 83 40 44 26 65 78 80 92 87 87 95 56 46 22 44 69 80 41 61 97 92 58 53 42 78 53 19 47 36 25 77 65 81 14 61 38 99 27 58 67 37 67 80 77 51 32 43 31 48 19 79 31 91 46 97 91 71 27 63 22 84 73 73 89 44 34 84 70 23 45 31 56 73 83 38 68 45 99 33 83 86 87 80
Как решать D?
Я делал динамой, на каждом шаге считал значение "пробки" (если девушка, то прибавлял, если парень, то убавлял, не уходя в минус) и количество парней, которое, нужно пройти. Ответом будет сумма "пробки" и парней для последней девушки, вот собственно мое решение http://mirror.codeforces.com/contest/353/submission/4736196
Я решал так: будем идти с конца строки в начало поддерживать количество девочек и время "простоя". Количество девочек равно количеству букв 'F' справа от текущей позиции, а время "простоя", числу, которое равно времени, которое должен подождать мальчик, чтобы начать меняться с девочками. Это число вычисляется следующим образом:
если s[i] = 'F', то уменьшим время "простоя" на 1, так как с этой девочкой можно будет поменяться и не ждать;
если s[i] = 'M', то увеличим время "простоя" на 1, потому придётся подождать, покуда этот мальчик пройдёт вперёд.
Также нужно учесть, чтобы время простоя не опускалось ниже 0(когда отнимаем, время = max(время — 1, 0)) и то, что не нужно увеличивать время "простоя", если спереди нету девочек.
Ответ будет равен max = (количества девочек + время простоя) для каждого мальчика.
Вот решение: http://mirror.codeforces.com/contest/353/submission/4731757.
Сначала найдем первого мальчика. Затем будем идти слева направо и поддерживать две величины: количество девочек, оставшихся слева и ответ для данного префикса. Теперь, если мы встречаем девочку то обновляем ответ для префикса:
Где
cnt
— это количество девочек,ans
— ответ для префикса.Почему это работает? Как только мы дошли до девочки, ответом для пройденного префикса станет время, когда эта девочка встанет на место (т.к. все девочки, которые слева уже будут на месте). Следовательно мы имеем два случая:
Текущая девочка догонит предыдущую, т.е. она встанет на свое место на секунду позже предыдущей.
Текущая девочка не догонит предыдущую, тогда она встанет на свое место за количество людей между ее текущей позицией и конечной позицией.
Код
Очень элегантно, спасибо
thanks for this great contest .......!!
What is the intended solution for E?
Задачи просто КЛАСС...!!! Спасибо авторам...!!!
It was fastest system testing i've ever faced on Codeforces.
Whole system testing phase just took 8 minutes. Codeforces Rocks!
May the rating changes take just as long next time :D
very good and fast system testing today! :)
First time I solved 4 problems during a contest on codeforces :-D
I'm happy although it's unrated for me :-) Thank you for preparing this contest!
Что за тест 31 в задаче C? Что там такого, что не отсеклось на более коротких тестах?
I joined late , problem C is very interested .. isn't it guys ?
Yeah, well the whole round was interesting. I like D most, though.
How solve the problem B??
You can solve B with greedy assignment of the blocks.
My solution: 4730199
Idea:
To solve problem B, you should put the number in balance (n numbers to heap 1 and n numbers to heap 2), to make the number of distinct 4 digit number maximum, if there are same number, say there are i number x (i>1, if i=1 it considered unique number that will be processed later), you should put (i div 2) number x into heap 1 and (i div 2) to heap 2, and if there are remainder (i is odd), save to heap 3 temporaryly (will be processed later).
After that process the rest unique number (i=1) into heap 1 and heap 2 equaly, if there are j unique number, put (j div 2) to heap 1 and j-(j div 2) to the heap 2. And then the rest (heap 3) will fill heap 1 and heap 2 until full (have n numbers each, the order isn't important)
Finally count the distinct number in heap 1, save to variable a and heap 2 to variable b, and the total distinct 4 digit number is a*b. and then just print the output.
If there are more simple solution I would like to know :-)
It's very clear, thank you
Как решать С?
Заметим: что если у нас есть маска 00101111 мы можем её превратить в 11001111 или в 11101111, т.к эти числа будут меньше исходного. Теперь можем идти по маске, если встретили ноль, то ничего не делаем, если встретили 1, то приводим к виду описанному выше и считаем сумму. Как посчитать сумму быстро. Для части левой от нуля можно подготовить массив сумм на отрезке от a0 до ai. Для правой части можно в самом начале посчитать в лоб и потом по мере прохождения по единицам убирать слагаемое из суммы. Код: http://mirror.codeforces.com/contest/353/submission/4736930
Спасибо.
Lot's of DP problems. Love that contest though i miss A for some silly mistake. :( (Y)
Actually any of this the problems may be solved without DP (except, maybe D, where solution could be called DP, but I wouldn't call it so)
Что-то странное творится, такой код локально работает мгновенно, а на ideone и тут в запуске TL'ится.
AFAIR, В одной из Java6, Java7 это копирует строчку, в другой нет.
Ага, видимо с jdk7u6 такое (http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-May/010257.html), а у меня более ранний update стоит.
Any ideas of around when the tutorial will be published?
Раз ещё не спросили, буду первым.
Расскажите, кто-нибудь, пожалуйста, как решать Е.
Я решал так — сначала найдем две одинаковых цифры подряд. Если такого нет, то все стрелки чередуются, поэтому ответ — n/2. Если же нашли, то начиная с этого места добавляем к итогу единичку либо за каждый "длинный" (более одной цифры) ряд из одинаковых цифр, либо за каждую пару разных одиночных цифр.
Awesome round. It is always a surprise when scoring goes dynamic. #Enjoyed. Looking forward for more matches of this kind.
nevermind
it was a awful contest!!!
У меня есть ощущение что авторское решение по Е неверно.Судя по всему, оно на тесте 011001 выводит 2, а на тесте 101100 — 3, хотя ответ должен быть одинаковым, т.к одна строка- циклический сдвиг другой.Точнее, это касается ухудшения моего решения с контеста. Решение на контесте не зашло, ухудшение — зашло.Все, я дурак, извиняюсь.
Не факт. Мое решение, получившее Accepted, выводит 3 на обоих тестах.
Ну тогда тесты, как минимум, слабоваты:)
Стыдно просить, но подскажите пожалуйста идею решения задачи A(код участников смотрел, все равно не понимаю)
Считаешь количество костей, у которых только одна сторона нечётная (достаточно хотя бы одну такую найти).
Считаешь суммы нижних и верхних значений костей.
Если обе суммы чётные — нечего делать, возвращаешь 0.
Если одна из сумм нечётная — исправить невозможно, возвращаешь -1.
Если обе суммы нечётные — проверяешь наличие фишек, у которых только одна сторона нечётная.
____Если таковые имеются — достаточно эту одну фишку перевернуть, возвращаешь 1.
____Если таковых нет — исправить невозможно, возвращаешь -1.
Ну а если не думать, то можно написать динамику dp[i][s1][s2] — сколько переворачиваний надо сделать среди первых i доминошек, чтобы четность сверху была s1, снизу s2. Чтобы не упустить каких-то вариантов.
It is 70 minutes after the contest now and ratings are not published yet...
how the system testing is so fast and the rating is so slow? Isn't harder to judge than to update the rating? Maybe I'm wrong, but it would be nice to know.
maybe checks all solutions to find cheaters .
wrong answer The number of cubics in first heap must be equal to 50, but it equals 54
Я все,конечно,понимаю,но при этом вариант,который выдает моя программа дает тоже 1936 вариантов. Так в чем проблема,можете обьяснить? (тест 6) Задача Б
Из условия — Он произвольным образом выбирает n кубиков. Следовательно, если в разбиении кучки различаются в размере, то это разбиение автоматически не подходит.
Ужас,спасибо большое,устал,условие прочитал невнимательно
Нужно разбить кубики поровну
...
http://mirror.codeforces.com/contest/353/submission/4733608 http://mirror.codeforces.com/contest/353/submission/4733370
dynamic scoring and dynamic problems ! thank you
dynamic scoring system and dynamic problems ! thank you
Update: The original comment is my mistake.
(353B - Two Heaps, test 6)I think Problem B judgement is wrong (the checker issues false negatives for some valid solutions).
In the problem statement there is a phrase:
"He arbitrarily chooses n cubes and puts them in the first heap. "
So it IS necessary that the heaps have the same size.