Только что закончился очередной opencup. Давайте обсуждать задачи здесь :)
№ | Пользователь | Рейтинг |
---|---|---|
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 | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Только что закончился очередной opencup. Давайте обсуждать задачи здесь :)
Название |
---|
Расскажите, пожалуйста, как решались задачи G, C и D?
C: нетрудно понять, что либо в каждой строке четность всех чисел одинакова, либо в каждом столбце. Теперь придерживаясь одной из этих стратегий попробуем расставить числа.
Не забыв отдельно разобрать случай когда n = 1 или m = 1. Иначе WA20.
Точно, самое главное забыл :)
D: Пусть k=1. Посчитаем для строки s динамику dp[i][mask] — количество упорядоченных наборов из n чисел из i бит каждое, где j-ый бит mask (j=0..n-1) равен 1, если j-ое число строго больше (j+1)-го, и равен 0, если эти числа равны (числа нумеруем от 1 до n, нулевое число это само s). В начале dp[0][0] = 1, в конце ответ хранится в dp[|s|][2^n-1] (все числа различны и максимальное из них строго меньше s), переходы делаются перебором набора i-ых битов.
Заметим, что точно такую же динамику можно считать, беря начальным значением dp[0][mask] = 1 для любой маски mask, давайте за a[mask1][mask2] обозначим dp[|s|][mask2], когда за начальное значение взято dp[0][mask1] = 1.
Теперь заметим, что для k=2 можно просто перебрать "маску равенств" после первых |s| бит, т.е. ответ для k=2 это сумма a[0][z] * a[z][2^n — 1] по всем маскам z. Заметим, что если считать, что a — матрица, то ответ для k=2 — это элемент с тем же самым индексом, что при k=1, но не матрицы a, а матрицы a^2. Точно так же ответ для произвольного k хранится в том же самом месте в матрице a^k. Осталось воспользоваться бинарным возведением матрицы в степень.
Ещё одно решение D за другую сложность. Забудем, что числа должны быть различными. Тогда ответ можно насчитать такой динамикой: dpij — ответ для i-ого префикса, если j чисел из набора уже меньше, чем R, а остальные равны R. С помощью той же идеи, что описал Copymaster, можно посчитать её за O(n3 * (|s| + log(k)). Теперь нужно посчитать все множества, в которых есть различные числа. Для этого перебираем все разбиения на подмножества, для каждого разбиения считаем, сколько подмножеств чётного размера, а сколько — нечётного. Пусть чётных множеств x, а нечётных множеств — y. Тогда количество способов выбрать n чисел, так чтобы все числа в одном множестве были равны, а в разных — различны, равно ansx * (r - x) * (r - x - 1) * ... * (r - x - y + 1), где ansx — количество множеств размера x без одинаковых элементов. Итоговая сложность — O(n4 * (|s| + log(k)) + n2 * Bn), где Bn — n-ое число Белла.
Понятно, что от числа Белла можно избавиться. Достаточно считать количество сколько разбиейний множества из n элементов на k четных и l нечетных. Это делается кубической динамикой.
Так как надо посчитать для всех n ответы, то нужно n4 * ...
Спасибо, исправил.
Интересно узнать, как решалась I. Видимо, промоделировать последние 10^7 шагов — неверно?)
Хватило промоделировать последние 8к шагов влоб
Рассмотрим любую клетку после первых 4к шагов — теперь у нас за один шаг покрывается целый столбец или целая строка, так вот если покрывается столбец или строка, то в следующий раз он покроется не больше чем через 4к шагов — это можно доказать из того, как смещаются покрываемые столбцы и строчки относительно начальной позиции — для столбцов (0, +2, -2, +4), для строк (-1, 2, -3, 4) — такая последовательность задает равномерное покрытие
Всё понятно, только откуда следует, что покрытие равномерное?)
Вот — я пока писал комент выше — понял еще одну интересную вещь рассмотрим процесс когда уже stepsize >= m, теперь всякое покрытие строчки будет покрывать ее всю
как я уже выше писал — последовательность, которая задает номера строчек для покрытия — (-1, 2, -3, 4, -5), через n/2 шагов нечетные элементы последовательности покроют все нечетные строки, четные элементы последовательности покроют все четные строки
У кого-нибудь в F зашёл поток в даблах на джаве? По слухам в интах заходил, но я пихал в даблах, и не утолкался ни Диниц, ни preflow push, ни разнообразные оптимизации...
У нас зашел. Такой код на Яндекс.Контесте работает 442мс.
Спасибо за код! Удивительно, что это работает безо всяких epsilon'ов (даже сравнение capacity и flow в конце точное!)
Что самое интересное, избавление от epsilon'ов в моём коде тоже даёт AC, 462ms для Диница. Учитывая, что с epsilon'ами тот же самый код получал ТЛ (>4c) — сравнение не с нулём тормозит программу в ~10 раз. Это довольно удивительно, единственное, что я могу предположить, — JIT сходит с ума, когда видит сравнение с числами вроде 1E-9. Но если подобный эффект наблюдается и для C++-программ, то тут что-то совсем весёлое.
А можешь попробовать в коде с епсами сделать так, чтобы в ребра, которые меньше eps сразу записывался 0?
Может кто нибудь покритиковать такое решение А:
Ясно, что если есть какая-то окружность, являющаяся ответом, то есть и такая, которая касается каких-то двух миньонов. (Ну или ответ — единица). Переберем эту пару. Таким образом мы задали семейство окружностей с центром на серединном перпендикуляре отрезка (между этими двумя миньонами). Бинпоиском найдем наибольший возможный радиус окружности (и центр, соответственно, тоже), и посмотрим, сколько миньонов внутри. Возьмем максимум.
Работает вроде как О (m^2*nLog(MAXR) + m^3) = O (m^3), где MAXR — ограничение на радиус. За 10 секунд можно и упихать наверно :)
Дай знать, если зайдет в дорешку =)
Кто-то дорешал уже? Расскажите :)
У меня похожее решение за куб уперлось в WA52. Ни у кого случайно не было? :) Догадываюсь, что мне в некоторых случаях не хватает точности.
Привет. Реквестую Е, Н див2.
H: Проведём рёбра от i к f(i). Для каждого снека выберем одно входящее ребро, с помощью которого можно получить выгоду (если их несколько — наибольшую). Пока все снеки есть хотя бы по одному, набираем. Потом может возникнуть проблема — граф с выбранными рёбрами может образовывать цикл, и взять все снеки, используя эти рёбра, не получится. Тогда постараемся минимизировать убыток в этом цикле. Рассмотрим каждый снек, прибылью которого мы жертвуем. Мы можем либо не взять его совсем, либо взять с помощью другого менее выгодного ребра, ведущего к нему, не входящего в цикл, если такое существует. Прибавляем к ответу прибыль по всему циклу, минимальный убыток отнимаем. В цепочках проблем нет, просто прибавляем суммарную прибыль от них.
E — будем искать ответ бинпоиском. Понятно, что верхняя граница — это минимальное среди значений по всем возможным группам из одного числа.
При фиксированном ответе нам выгодно действовать жадно и каждый раз пытаться набрать в группу как можно больше чисел; если потребуется меньше k групп, то мы можем какие-то из них разделить, и это будет валидно, а ответ не меньше нашего предположения; если больше k, то ответ меньше нашего предположения.
Расскажите еще G пожалуйста. Я пробовал упихать перебор, но дальше 38 теста дойти не удалось
1) Перебираем все возможные строки-кандидаты на ответ. Их мало (совсем верхняя граница говорит 18*200, но если рассматривать лишь различные, и смотреть на число символов, их будет мало)
2) Пишем динамику за n^3 / len: dp[i][j]=можно ли получить из пустой строки подстроку с i по j. Переход с помощью вспомогательной динамики dp2[j]: можно ли при фиксированном i получить строку i..j (считаем, что (j-i-1) % len + 1 символов относятся к самой "первой", внешней, строке, из которой получаем i..j).
Заходит за 50 мс.
Не очень понятно, что делает вторая динамика и соответственно как делается переход в первой. Если не сложно, скиньте еще пожалуйста код.
Как-то так. В main'e перебирается подстрока-ответ, а в solve проверяется, подходит ли она.
Считали ровно то же самое, но без вспомогательной динамики. Для dp[l][r] брали dp[l][r-1], если s[r] могло быть продолжением префикса "внешней" строки длины (r-l) % len, ну а если s[r] не подходит, или dp[l][r-1] == false, то последний символ подстроки точно не входит во "внешнюю", и нужно убрать суффикс длины k * len: dp[l][r] |= dp[l][r-k*len] & dp[r-k*len + 1][r].
У меня решение аналогично решению Ильи + оптимизация, что если число букв в строке которую проверяем не матчится с числом букв на отрезке, то сразу говорим ответ. code Кто-то умеет делать для этого тесты, чтобы оно работало хоть как-то долго? (В Я.контесте зашло за 7ms.)
Anything about A or B?
B is a slightly harder version of my old problem: http://acm.sgu.ru/problem.php?contest=0&problem=309 . In this problem you have to be a bit more careful, but the idea is the same: binary search + the idea that with 3 squares at least one of the squares has both sides on the border of the enclosing rectangle.