4 августа 2017 в 11:00 (время московское) открывается первый этап SnarkNews Summer Series 2017. Как и несколько предыдущих серий, SNSS-2017 пройдёт на системе Яндекс.Контест. Опубликовано расписание серии.
По просьбам участников отдельно публикую ссылку для регистрации и входа в первый раунд. В комментариях к этому сообщению по окончании раунда в соответствии с расписанием можно будет обсудить задачи первого раунда.
B, C?
C: Подходит многочлен (x - 1)(x - 2)... (x - n) + x. Надо найти произведение. Это можно сделать в стиле divide and conquer: разделим множители на две части, вычислим ответы для каждой и просто перемножим их. f(n) = 2f(n / 2) + O(n2) даёт f(n) = O(n2). А можно и с FFT, наверное.
B: bitset. Будем идти по возрастанию искомого маршрута и поддерживать для каждой строки два битсета: из каких клеток этой строки можно пойти вправо на k и вниз на k. Из этого логическими операциями и сдвигами можно собрать условие на клетку, может ли она быть центром маршрута, и посчитать количество единичных битов в результате.
С: Так как модуль простой и больше n, то подойдёт (x - 1)(x - 2)... (x - n) + x (совпадает с x в точках 1, 2, ..., n и отличается в n + 1). Перемножать можно просто последовательно за квадрат.
B: Отразим картинку относительно диагонали из левого верхнего угла в правый нижний (это неважно, но мне так проще объяснять). Тогда маршрут сперва идёт вниз, потом вправо, потом опять вниз. Для каждой клетки посчитаем, насколько мы можем отойти вверх, не пересекая водоёмов и края поля и насколько можем отойти вниз (массивы
u
иd
). Каждая строка разбивается на максимальные по включению отрезки, на которых нет водоёмов, будем решать для них независимо. Пусть мы находимся на таком отрезке с l по r в i-той строке. Тога мы хотим выбрать целые числа s и q, что l ≤ s < s + 2q ≤ r, при этомu[i][s] >= q
иd[i][s + 2q] >= q
(соответствует маршруту(i - q, s) -> (i, s) -> (i, s + 2q) -> (i + q, s + 2q)
). Давайте переберём s, тогда q может меняться в пределах от 1 доmin(u[i][s], (r - s) / 2)
и нужно посчитать для скольки q из этого отрезкаd[i][s + 2q] >= q
. Это запрос вида "на отрезке посчитать число позиций, x фиксированной чётности, для которыхd[i][x] - (x / 2) >= -(s / 2)
". Если хранить два дерева отрезков для каждой чётности и перебирать s в порядке возрастания (при этом будут появляться новые хорошие значения x), то получается решение за . У меня без упихивания зашло в дорешку.