Предлагаю здесь обсуждать задачи и результаты.
Как выводить сами отрезки в четвертой и как делать последнюю на 70 или 100%? Ну и, собственно — кто как написал?
№ | Пользователь | Рейтинг |
---|---|---|
1 | ecnerwala | 3649 |
2 | Benq | 3581 |
3 | orzdevinwang | 3570 |
4 | Geothermal | 3569 |
4 | cnnfls_csy | 3569 |
6 | tourist | 3565 |
7 | maroonrk | 3531 |
8 | Radewoosh | 3521 |
9 | Um_nik | 3482 |
10 | jiangly | 3468 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | maomao90 | 174 |
2 | awoo | 164 |
3 | adamant | 162 |
4 | TheScrasse | 159 |
5 | nor | 158 |
6 | maroonrk | 156 |
7 | -is-this-fft- | 151 |
8 | SecondThread | 147 |
9 | orz | 146 |
10 | pajenegod | 145 |
Предлагаю здесь обсуждать задачи и результаты.
Как выводить сами отрезки в четвертой и как делать последнюю на 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 как раз и будут искомые суммы по всем подмаскам.