Сегодня в 15:00 состоится SRM 544.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 166 |
2 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Название |
---|
Опять не прислали письмо -- будет совсем мало народу :(
Возможно, письмо не прислали из-за проблем, которые обсуждаются тут. Проблема с сабмитом задач.
А кстати это действительно еще не пофиксили.
UPD. А теперь похоже пофиксили.
А вот сейчас в админской уже два человека опять жалуются.
Как жаль, что письмо не прислали :(
Меня одного пугают ресубмиты Petr а?
Пугают? Наверное, только тебя.
P.S. Ну или я чего-то не понимаю: нашёл ошибку, перепослал, потом сломал людей на этом.
Да меня тоже :)
Как решать 500?
Жадно. Посмотрим на верхний правый угол, выделим в нём максимальную диаграмму Юнга (фигурку, где мы идём только вниз и вправо) из нулей, и откусим её дополнение.
А почему это правда?
Пусть есть два пересекающихся пути из левого верхнего угла в правый нижний, если они пересекаются, сделаем, чтобы они только касались, повторить.
Грубо говоря,
Это-то понятно. А почему жадность работает?
Потому что применим это к оптимальному ответу — получится ответ, имеющий такой вид.
Потому что:
1) Если мы в какой-то ход инвертируем более правые клетки, чем по данному алгоритму, то ситуация явно не улучшится (правые клетки вообще нет смысла трогать)
2) Каждая единичка должна быть инвертирована хоть раз.
3) Соответственно получаем множество клеток, которые должны быть инвертированы хоть раз — все единички, а также все клетки левее и/или ниже.
4) Любую пару инверсий можно заменить на пару инверсий: объединение и пересечение инвертируемых множеств.
5) таким образом, любой набор инверсий можно заменить на другой такой набор, что в него будет входить инверсия, соответствующая первому ходу данного алгоритма.
6) Далее по индукции =)
Заходит ли в 500-ке такая жадность: до победного выбираем цепочку из верхних-правых единичек и инвертим?
Я не смог сгенерировать тест, дающих больше 99 операций...
Потому что такая жадность гарантированно даёт алгоритм за 99 операций.
Ответ можно легко сверху оценить как 2*h*w=5000. Каждую единичку можно красить по отдельности, пусть это и неоптимально.
А как у всех была матрица 4*4 в 900-ке? У меня почему-то была 13*13, и это не заработало в упор.
А откуда 13й элемент? Я думал нужно 12.
Мне еще 1 нужна.
Динамика за O(n): считаем f1, fx, fy, fxy. По названиям вроде понятно, что есть что (количество, суммы x и y, ответ). Далее это нехитрыми формулами пересчитывается. Поворот же есть изменение координат (x, y) --> (y, x) с какими-то знаками.
А все. я долбак. Нужно было 16. Мне приятнее писать формулы, еще зафиксировав направление.
Мне тоже, но я решил, что 16*16 — слишком много, поэтому сделал для 4*4.
Мне не очень понятен переход от x * y * cnt до суммы иксов и игриков, можно привести рассуждения сводящие одно к другому?
Добавьте в состояние направление. Тогда сумма просто явно очевидно выписывается с учетом того, что (x+1)y = xy+y. А дальше можно сжать назад в 4. Только лично мне не понятно зачем.
Что-то я не понял как она очевидно выписывается. Ну да ладно, подожду разбора.
fxy, 0 = S * fxy, 0 + L * fxy, 1 + R * fxy, 3 + S * fy, 0
fy, 0 = S * fy, 0 + L * fy, 1 + R * fy, 3 + dy0 * f1, 0
Мне хватило 4на4 — очки, сумма х-координат, сумма у-координат и число точек.
если 500 действительно так элементарно решается, то как же тогда решается 275?
мне одному кажется, что 500 была проще 275?
Тест { 0, 0, 0 } валидный для 275?
да
ответ -1 конечно)
Насколько я понял, валидный, но ответ на него -1.
Нет, не валидный, приходил клар, где говорилось, что сумма начального вектора больше 0.
хм, а я понял его как "количество голосовавших должно быть положительно"
UPD он валидный хотя бы потому, что я тестил его в арене :)
Ну значит я не так понял, потому что я одним глазом посмотрел. Внимания особого не обратил.
А арена разве проверяет тест на валидность и соответствие ограничениям?
Когда взламываешь — да.
а когда сам тестирую свой код?
И когда сам тестируешь, и когда автор добавляет тесты через MPSQAS (если тест не проходит проверку, задачу невозможно засабмитить).
Как доказать оценку на макс.ответ в easy div1?
Тоже интересует то же. ;)
А что ответа до сих пор нет, да ещё в комплекте с тем, что на TopCoder Forums до сих пор нет ветки "SRM 544" и задать вопрос в правильном месте нельзя... вообще создаёт всякие нехорошие подозрения типа <<а точно ли у авторов есть доказательство?>>.
И вообще интересный матч — по крайней мере в 275 и 500 надо кодить совершенно очевидные алгоритмы совершенно не очевидной правильности. Я не говорю, что это плохо. Но необычно. И заставляет очень хорошо прочувствовать особенность формата соревнований (проверка в конце, пройти должно все тесты).
Я для себя подумал, что если ответ есть, то он лежит в диапазоне n * 100 * 2, мне это было как-то интуитивно понятно. Для доказательства нужны формулы для верхней/нижней оценки на число голосующих при заданном проценте и количестве голосующих, но я их не выводил а искал бинпоиском.
верно в 275 такое решение (отправил от безысходности): перебираем ответ до миллиона (допутим), находим для каждого элемента его минимальное и максимальное возможное значение, проверяем, что минимальное значение действительно меньше максимального, суммируем минимальные значния и максимальные и в конце смотрим, что ответ лежит между минимальной и максимальной суммой?
Ну других я вроде не видел.
просто многие такие челеньжили (ну вроде это потому что они забывали проверять то, что минимальное значение меньше максимального)
или неправильно обрабатывали 0
или current_answer?
не подскажешь контртест на непроверку min<=max ?
Из каких-то общих соображений его не бывает. Казалось бы если такое случилось, то длина промежутка маленькая, и не понятно как оно скомпенсируется в сумме.
Ага, доказал вроде бы тоже сейчас, гуд.
Ещё можно не проверить, что минимальное значение получилось неотрицательным.
Нет, это потому, что забывали проверять, что минимальное значение не меньше 0, а максимальное — не больше числа голосующих
Причем, снизу, как оказалось, достаточно.
SystemTest когда начнется?
Он уже, вроде как, давно закончен. Это у них так медленно обновляются результаты в арене.
Я конечно все понимаю, но как они сделали что первая комната показалась, а потом все ждет не знаю уж там чего?
Причем это уже несколько последних СРМов так.
Вот такой у них отличный софт
Можете объяснить как решается 1000 задача второго дивизиона?
Ну дп очевидно. Мы одновременно перебираем каким образом могла быть построена колода во время первой фазы, и каким образом она могла быть разобрана в течение второй фазы. Состояние характеризуется четвёркой чисел (i, j, a, b) i и j это сколько чисел из начальной колоды алисы и боба мы выложили в общую колоду в первой фазе, a и b это сколько чисел мы выложили из общей колоды в колоды алисы и боба. мы производим действия одновременно, поэтому на каждом шаге у нас i + j == a + b, отсюда выходит порядка 50^3 состояний ДП. переход осуществляется за O(1) : мы знаем i и j, таким образом мы знаем какое число лежит сейчас наверху каждой из начальных колод, одно из этих чисел мы можем положить в колоду, также мы знаем те числа которые мы можем изъять из колоды на этом шаге. Понятно объяснил?
UPD: Почти то что я описал можно увидеть в решении PEIN, только он не запаривается о размерах массива, а так и сделал 50^4 ну и в обратном порядке выполняет действия, чтобы рекурсивно считать.
Не совсем понял.
Для состояния хранится количество вариантов в это состояние попасть. В каждое состояние можно попасть из четырех: (i-1; j; a-1; b), (i-1; j; a; b-1), (i; j-1; a-1; b), (i; j-1; a; b-1). Как проверить, что переход в одно из следующих возможен понятно.
Но как использовать предыдущие состояния, и сделать динамику я не понял.
UPD: где можно это решение посмотреть?
Я не понял чего ты не понял. Ты понял что есть состояния, ты понял как построить переходы. Что еще нужно? Давай посмотрим на граф, где вершины это состояния.
"В каждое состояние можно попасть из четырех: (i-1; j; a-1; b), (i-1; j; a; b-1), (i; j-1; a-1; b), (i; j-1; a; b-1). Как проверить, что переход в одно из следующих возможен понятно."
Этими словами ты описал как направлены рёбра, ты также знаешь условия при которых ребро есть или отсутствует. Например при выполнении некоторого условия у нас может быть ребро из (i-1, j, a-1, b) в (i, j, a, b).
граф ацикличен в силу того, что сумма i+j+a+b только возрастает если двигаться по ребрам. тебе нужно посчитать число способов добраться из вершины (0, 0, 0, 0) в (X0, X1, X2, X3) как это сделать? ДП, такое дп ты писал не один раз я думаю. Например можно поставить 1 в (0, 0, 0, 0) и бфсом приплюсовывать эту величину к тем вершинам, в которые ведут рёбра. Можно делать с помощью рекурсивного дп, рассчитывать это в обратном направлении, как это сделал PEIN. И да, прямо таки бфс нам здесь не нужен, ведь мы можем разбить граф на слои по значению суммы i + j
UPD: бфс не годится для произвольного ацикличного графа, не знаю почему я так написал, но в общем это классическая задача о подсчёте количества путей.
Да, теперь понял. Спасибо.
В арене топкодера, Practice Rooms