Good news everyone!
9 мая (всех с праздником!) в 5 утра по Москве, наше любимое время, состоится очередной SRM
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 155 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | nor | 152 |
Название |
---|
Вот подстава... Почему срм должен был быть в день когда нельзя не выспаться?
Они б ещё 22 июня в 4 утра сделали
А был в прошлом году :)
Anonymous снова сорвался =(
Как решать Div1.Medium ?
динамика. Состояние — текущая маска и сколько мы уже букв проверили. Переход — надо пойти по всем позициям, которые уменьшают маску + (количество всех, которые маску не меняют — сколько уже проверили) раз пойти в текущую маску
а если не хранить количество провереных букв и идти только туда, где маска уменьшается не верно?
это не работает на сэмплах
Если делить на нужный коефициент то семплы проходит.
Даешь подбор констант!
(1-k/длина слова) где к — количество переходов из маски в саму себя. Очевидно откуда он берется.
Верно, видимо. Но в 5 утра я до этого не допер
Как можно было догадаться до формулы в 250? >_<
P.s. идея решать в 5 утра была очень неправильной.
Ну, там и без формулы простое решение за квадрат
Ну я имею ввиду формулу в простом решении за квадрат. В упор не понимаю, откуда оно берётся.
UPD. Осознал. Мозг отказывался посчитать способы, которыми точки можно засунуть в прямоугольник.
Не очень понимаю, где там именно нечто, которое можно назвать формулой, но может поможет:
Сумма расстояний зависит только от расстояния между правой и левой вершинами и верхней и нижней.
Посчитали для каждого расстояния кол-во способов его получить. Далее для пары (расст. по X, расст. по Y), если время суммарное в [min, max] добавляем к ответу кол-во способв выбрать третью X и третью Y координату. Ну и умножаем на 6 — кол-во способв расставить 3 ладей в квадрате 3x3
рассмотрим все 6 вариантов упорядочивания точек по y. для 4х из них фигура обхода — это прямоугольник, для которого ответ (a-1)*(b-1), a,b — стороны прямоугольника. Для остальных двух вариантов, где точки строго убывают/возрастают, фигура тоже сводится к прямоугольнику, и в нём тоже ответ (a-1)*(b-1). Ещё нужно учесть все варианты расположения этого прямоугольника, т.е. (X-a)*(Y-b). И того формула res += (a-1)*(b-1)*6*(X-a)*(Y-b). Если вы конечно об этой формуле :)
кстати, как оказалось 32 миллиона взятий модуля для Java это много...
Откуда 32 миллиона?
П.С. Ответ можно в считать в лонгах и только в конце взять по модулю.
ну я начал писать через f(maxT)-f(minT-1). f(t) — это 4000*4000. и ещё дважды. понятно, что можно написать и 4000*4000 на итах, или без модулей, но всё равно обидно.
Посмотрим на прямоугольник AxB, отметим в нём три строки(первую, последнюю и I-ую[0<I<A]) и три столбца(первый, последний и J-ый[0<J<B]). Таких прямоугольников (A-2) × (B-2).
Такие прямоугольники можно расположить (X-A+1) × (Y-B+1) способами, при этом в них будет маршрут длины ровно (A+B-1) × 2. Теперь переберёмся по всем A и В и посуммируем ответ.
Ещё нужно не забыть умножить на 3!
Да, мы хотим посчитать каждый треугольник единожды.
Я вот на контесте фиксировал только два крайних столбца и считал что формула, (X-A+1)*(Y-B+1)*(B-2)*6. Я знал что формула должна быть симметричной и что ответ где то рядом.
Но когда увидел что осталось 7 мин. мой мозг буквально отключился...
Расскажите, пожалуйста хард :)
Единственное непалевное решение вроде у dzhulgakov, там видно, что бинарный по ответу + поток. Понять я его пока не могу
Я такое накодил, но допустил тупой баг и оно не проходило семплы :( Там задача сводится к hard life с NEERC 2006.
Можешь рассказать, как сводить?
Сейчас, если пройдет в практис руме.
Видимо, не пройдет. У меня выдает то же что и у dzhulgakov на том тесте, на котором у него упало.
Попробуй. Мне вот тут подсказывают, что у него просто проблемы с точностью
Да, проблемы с точностью, если в моем решении заменить финальную проверку в бинпоиске изменить с величины потока на количество достижимых вершин, то решение проходит в практисе.
Теперь немного о решении. Есть замечательный алгоритм Гольдберга для поиска подграфа с максимальной средней степенью: http://www.eecs.berkeley.edu/Pubs/TechRpts/1984/CSD-84-171.pdf В нем мы максимизируем sum(edges)/K, в нашем же случае в знаменателе стоит квадратичная функция. Однако оказывается, что такое же решение можно применить и в данном случае.
Будем делать бинпоиск по ответу. Пусть мы хотим проверить значение g. Тогда мы хотим проверить неравенство
если умножить на знаменатель и перегрупировать получаем
квадратичный член в правой части можно внести внутрь суммы, получим
ну а дальше осталось применить алгоритм Гольберга, т.е. построить подходящий граф и пустить в нем поток. Если минимальный разрез содержит больше 1 вершины в левой доле, то идем в одну сторону в бинпоиске, иначе — в другую. Конкретные веса ребер можно посмотреть у меня в решении или в оригинальной статье.
Собственно я долго выводил эти выражения, где-то ошибся и в итоге 10 минут подбирал коэффициенты, чтобы прошло тесты :) К сожалению я упустил момент с точностью, буквально исправление одной строки делает решение правильным. Также я не успел написать нормальный поток, так что мое решение проходит в практисе за 1.8 секунды.
Очень круто, спасибо!)
У меня было неправильно сведение, но Дима рассказал как надо правильно избавляться от квадратов в знаменателе. Идея следующая: пусть мы хотим проверить, превышает ли наш ответ X или нет. То есть, нам надо узнать, существует ли такой набор из k вершин с суммой весов ребер sum, что sum / (200k - k2) ≥ X.
это эквивалентно sum + k2X ≥ 200Xk
Всего суммарная степень в подграфе (k2 - k) / 2. Назначим ребрам новые веса: newcostij = costij + 2X. Тогда 2sum + k2X = newsum + 2kX. То есть, нам надо проверить newsum - 398Xk ≥ 0.
Получили задачу: проверить, существует ли в графе с новыми весами подграф, у которого средний вес ребра не меньше 199X. Это уже задача HardLife. Как ее решать, можно почитать здесь.
UPD: Дима сам меня опередил. Правда, у меня оно сдалось только после некоторых плясок с бубном вокруг эпсилона.
На чем челленджили 500?
А, ну там вроде у некоторых мапы были.
я почелленжил экспоненциальное решение в своей комнате, но это было тривиал =)