Сегодня в 16:00 (МСК) началась девятая интернет-олимпиада. После ее окончания предлагаю здесь обсудить решения и прочее.
Ссылка: neerc.ifmo.ru/school/
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | jiangly | 3810 |
| 2 | Benq | 3676 |
| 3 | Kevin114514 | 3655 |
| 4 | maroonrk | 3463 |
| 5 | strapple | 3447 |
| 6 | Um_nik | 3387 |
| 7 | heuristica | 3322 |
| 8 | turmax | 3317 |
| 9 | tourist | 3307 |
| 10 | jiangbowen | 3291 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 156 |
| 2 | nik_exists | 150 |
| 2 | maspy | 150 |
| 4 | Um_nik | 144 |
| 5 | Errichto | 139 |
| 6 | adamant | 137 |
| 7 | AmShZ | 136 |
| 8 | BledDest | 132 |
| 8 | maroonrk | 132 |
| 10 | qwexd | 129 |
| Название |
|---|



тыц тыц
Сомневаюсь, что к старым правилам вобще когда-нибудь вернутся.
Может быть я конечно жестко туплю и все это неверно.
Решение 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
Думаю , это очевидное решение.
Если пройдет, то напишу полностью.