Предлагаю здесь обсуждать задачи и результаты.
Как выводить сами отрезки в четвертой и как делать последнюю на 70 или 100%? Ну и, собственно — кто как написал?
№ | Пользователь | Рейтинг |
---|---|---|
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 | 165 |
2 | maomao90 | 164 |
3 | Um_nik | 163 |
4 | atcoder_official | 160 |
4 | adamant | 160 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
8 | Dominater069 | 154 |
8 | nor | 154 |
Предлагаю здесь обсуждать задачи и результаты.
Как выводить сами отрезки в четвертой и как делать последнюю на 70 или 100%? Ну и, собственно — кто как написал?
Название |
---|
В четвертой можно было выводить отрезки (5000, i) — (i, -5000) для i начиная от 4999. Я, правда, вместо этого написал извращенную жадность, которая соединяла верхнюю и нижнюю стороны отрезками, а затем забил массив констант.
Правду говорят, утро вечера мудренее. Вчера за полтора часа на контесте не придумал нормальное решение последней, а с утра за 10 минут пришло в голову.
Идея следующая. В начале для каждой маски запишем величину g(mask) — сколько есть ящиков, в которых лежит такая маска игрушек. После этого, для всех масок посчитаем величину f(mask), которая равна сумме g(s) по всем s — подмаскам mask. Теперь ответ будем искать по формуле включений-исключений: всего есть 2^n наборов. Вычтем из этого количества те наборы, которые не покрывают каждый отдельный бит. Затем прибавим те, которые не покрывают все пары и т.д.. При нормальной реализации это все работает за O(nm + 2^m * m).
Вот код.
"после этого, для всех масок посчитаем величину f(mask), которая равна сумме g(s) по всем s — подмаскам mask" а как считать такое не за 3^m?
Рассмотрим следующую динамику: f(mask, pos) — сумма по всем g(s), для которых первые pos бит маски s являются подмаской первых pos бит маски mask, а оставшиеся биты совпадают с соответствующими битами маски mask. Тогда пересчитывать ее можно так:
f(mask, pos) = f(mask, pos - 1)
, если pos-й бит равен 0,f(mask, pos) = f(mask, pos - 1) + f(mask \ {pos}, pos)
, если pos-й бит равен 1.Легко заметить, что второй параметр нам не нужен. Можно это все хранить в одном одномерном массиве:
После выполнения этого куска кода в массиве g как раз и будут искомые суммы по всем подмаскам.