Завершился первый раунд SNWS 2013.
Давайте обсудим задачи. Интересно, как решалась B.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | Dominater069 | 154 |
8 | awoo | 154 |
10 | luogu_official | 150 |
Завершился первый раунд SNWS 2013.
Давайте обсудим задачи. Интересно, как решалась B.
Название |
---|
И F объясните, пожалуйста, как решалась)))
В F важно понимать, что если мы зафиксировали набор типов граблей, наступанию на которые мы не будем обучаться, то дальше нет разницы, через какие из ных мы перепрыгнем. Значит, заведем динамику f(i, j) — минимальное количество ударов по голове, если мы уже прошли первые i типов граблей и перепрыгнули j раз. Тогда мы либо обучаемся граблям текущего типа, получив ai ударов, при этом ничего не перепрыгиваем, либо же ничему не обучаемся и перепрыгиваем по максимуму, т.е. min(K - j, bi) раз. Сложность O(NK).
Долго хохотал над фразой "минимальное количество ударов по голове" (контест не писал, условия не читал).
Динамика:
d[i][j], где i -- количество обработанных типов граблей, j -- количество совершенных прыжков Петей.
Для каждого состояния три перехода:
Итого: O(NK), исходник: http://pastie.org/5669554
В B я перебирал сторону одну прямоугольника (<= N * max(W, H)), а дальше проверял, что если прямоугольник AxB можно замостить карточками WxH, то пробуем улучшить ответ.
Еще раз для тех кто в танке. Как это делать?
Мне подумалось что-то такое: сначала сократим w и h на их НОД, теперь либо w|a и h|b, либо w|b и h|a, либо одно из a и b делится на wh, тогда проверяем, что другое представимо в виде wx + hy, где x, y ≥ 0. Но я это даже не писал, если что.
Да, оно и есть. В сазанке была в этом году, это боян с CEPC2008 ( http://acm.hdu.edu.cn/showproblem.php?pid=2965 ). Я доказывать не умею.
Proof
там можно было проще. пользуясь той фишкой с сазанки, что возможное разбиение можно поделить на две части, перебираем a и b — две части одной стороны. дальше нужно узнать c и d (a*c — прямоугольник со всеми вертикальными, b*d — горизонтальными карточками), а это просто два уравнения ac+bd=n, cw=dh. выражаем d и c отсюда целочисленно, проверяем равенства, обновляем ответ.
В B я поверил, что работает динамика по количеству плашек и ширине (т.е. в замощении ничего не цепляется) и написать её, "за куб": перебираем. На самом деле будет работать за какой-нибудь O(N2)/
Unable to parse markup [type=CF_TEX]
, потому что ширина должна быть делителем понятно чего.Код.
P.S. Пример, когда "цепляется":
C тоже интересно как решать
У меня была проблема с пониманием условия: я не понял, что нам необязательно проверять всех больных из палаты. Т.е. если k = n, то ответ может быть довольно большим.
А дальше очевидная кубическая динамика по дереву: сколько максимум из поддерева можно позвать людей, если осталось сколько-то комнат. При пересчёте "обрезаем" это количество по мощности ребра.
Ааааа, это написано в самом конце самого последнего примечания, ну я учту такие подлянки на будущее.
Я B решил так:
set < pair<int,int> > a[i]
— всевозможные прямоугольники, выраженные парами (длина,ширина), составленные из i карточек.Теперь просто пробежим по каждому i и для каждого прямоугольника попробуем достроить и получить другой прямоугольник, я делал добавление ряда горизонтальных и вертикальных карточек справа и снизу (это 4 варианта) и ещё можно фиксированный прямоугольник приписать к себе же, причём много раз. Я не доказывал что наборы будут не сильно большой длины, но думаю это можно сделать. Ответ будет лежать в a[n].