Сегодня в 16:00 (МСК) началась девятая интернет-олимпиада. После ее окончания предлагаю здесь обсудить решения и прочее.
Ссылка: neerc.ifmo.ru/school/
№ | Пользователь | Рейтинг |
---|---|---|
1 | Radewoosh | 3611 |
2 | jiangly | 3597 |
3 | Benq | 3593 |
4 | ecnerwala | 3584 |
5 | orzdevinwang | 3570 |
6 | cnnfls_csy | 3569 |
7 | tourist | 3565 |
8 | maroonrk | 3487 |
9 | gyh20 | 3447 |
10 | Rebelz | 3409 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | maomao90 | 174 |
2 | awoo | 164 |
3 | adamant | 163 |
4 | TheScrasse | 159 |
5 | nor | 158 |
6 | maroonrk | 156 |
7 | -is-this-fft- | 151 |
8 | SecondThread | 147 |
9 | orz | 146 |
10 | pajenegod | 145 |
Название |
---|
тыц тыц
Сомневаюсь, что к старым правилам вобще когда-нибудь вернутся.
Может быть я конечно жестко туплю и все это неверно.
Решение D на 100 баллов
Подвесим дерево за произвольную вершину. Посчитаем две динамики на поддеревьях: f[v] - на какой глубине находится ближайшая ловушка, и g[v] - на какой глубине находится ближайший непокрытый таракан. Как делать переходы? Для текущей вершины после обработки детей посчитаем минимум по всем f[child(v)] и максимум по всем g[child(v)]. Пусть первое число - a, второе - b. Тогда возможны три ситуации.
1) a + b <= k
Тогда самый удаленный таракан покрывается самой высокой ловушкой из другого поддерева. В этом поддереве не остается непокрытых тараканов, а самая глубокая ловушка находится на глубине a+1.
f[v] = a+1, g[v] = 0
2) a + b > k, b < k
У нас есть тараканы, которых мы не можем покрыть, но они не настолько глубоко, чтобы ставить тут ловушку (если мы постави ее выше, хуже не будет).
f[v] = a+1, g[v] = b+1
3) a + b > k, b == k
Самый глубокий непокрытый таракан в поддереве не может быть покрыт иначе, кроме как из этой вершины. Ставим тут ловушку, тем самым покрывая всех непокрытых тараканов в поддереве (т к их глубина <= k).
f[a] = 0, g[a] = 0
Ну и если мы находимся в корне и у нас есть непокрытые тараканы, мы обязаны поставить там ловушку.
odd(N) -N/2+D, -N/2+1+D, ..., D, ... D+N/2
even(N) -N/2+D, -N/2+1+D,..., D-1, D+1, D+N/2
Думаю , это очевидное решение.
Если пройдет, то напишу полностью.