I_love_natalia's blog

By I_love_natalia, 13 years ago, In Russian

Подумал, что отвечать в соответствующем обсуждении каждому будет утомительно, решил создать для этого новую ветку.

Примечание. Ни одну задачу не сдавал. Могут быть ошибки. Пишу как решал бы сам, что не придумал очно - спасибо MikeMirzayanov за замечательный разбор после контеста.

Задача А.
Общие намеки на решение

Может быть показано, что при оптимальном начальном выборе игроков ситуация на поле полностью определяется тройкой чисел (расстояния до гениев).

Действительно, понятно, что если расстояние до некоторого (одного) гения у игрока 2 меньше, чем у игрока 1, то помешать "захватить" его игрок 1 никак не может.

Теперь, если расстояния до двух гениев игрока 2 меньше, чем у игрока 1, то в ответ на каждое движение к одному из этих гениев игрока 1 игрок 2 может просто двигаться к нему же, тем самым сохраняя описанный баланс.

утверждение 1. Игрок 2 при оптимальном начальном выборе не может изменить баланс ходом приблизижающим к двум "лучшим" гениям одновременно. Иначе: а почему он сразу не выбрал первой эту точку?
утверждение 2. Игрок 1 при оптимальном начальном выборе не может изменить баланс ходом приблизижающим к двум "лучшим" гениям одновременно. Иначе: а почему игрок 2 не выбрал первой эту точку?

Таким образом, задача сводится к анализу позиции, определяемой тройкой расстояний, на предмет выбора начального положения. Дальше сами.

Задача В.

Отсортируем банки по координате, посчитаем частичные максимумы для ответа на запрос "количество денег на отрезке индексов 1..i", переберем правый ограбляемый банк и бинпоиском найдем границу индекса возможного левого. Лучшая сумма - ответ.

Задача С.

Перебираем все пары горизонтальных отрезков, считаем, сколько вертикальных пересекает их оба, и прибавляем к счетчику С(верт, 2)

Задача D.

Думаю, что не решившие эту задачу зря читают этот разбор.

Задача Е.

Найдем (взвешенный) центр дерева. Дальше разберем случаи, а ответ найдем по динамике по поддеревьям.

Upd. Если центр - две точки, то надо либо пошинковать ребро между ними, либо поддерево одной, либо поддерево другой. Если центр - одна точка, надо пошинковать все кроме одного пути от нее до наиболее удаленных.

Задача F.

Для начала, вычистим строчку от вхождения [a-z][A-Z]. Например, aA означает понятно что, а aB понятно что.

Также, если первая команда вытащить или последняя добавить - понятно что.

После этого строка будет выглядеть как ([a-z]*\*[A-Z]*)* (то есть перед каждой звездочки будет сколько-то добавлений в стек, после - сколько-то вытаскиваний из стека)

Воспользуемся стандартной динамикой по подотрезкам.

Ответ на отрезке [i,j] это единица плюс (либо ответ на отрезке [i-1,j-1], если s[i] == s[j], либо ответ на отрезке [i, j-1], если s[i] == '*', либо ответ на отрезке [i+1, j], если s[j] == '*'),
либо ноль плюс (либо ответ на отрезке [i, j-1], если s[j] == '*', либо ответ на отрезке [i+1, j], если s[i] == '*', либо сумма ответов на отрезках [i,k] и [k+1,j])

Заметим, что в качестве k в последнем случае достаточно проверить лишь либо позицию звездочки, либо позицию границы описанного выше шаблона.
Доказательство. а) заметим, что если подпоследовательность начинается закрывающейся, она неправильная. б) заметим, что если подпоследовательность заканчивается открывающейся, она неправильная. в) заметим, что все позиции, где не выполняются пункты а) и б) - указанные выше.

Задача G.

В качестве состояния берем (позиция короля, маска наличия фигур) и запускаем BFS. Достижимости считаем заранее для каждой маски.

Задача H.


Понятно, что достаточно найти gcd всех чисел заданного шаблона.

Выпишем все возможные числа, получающиеся заменой одной буквы на 1, а остальных на 0.
Если различных букв 10, то вычтем из всех минимальное из них, а само минимальное помножим на 45.
Полученный набор чисел имеет gcd как исходный набор.

Доказательство (на примере).
Пусть s = 'lalala'. Тогда любое получаемое число имеет вид x(L,A) = L * 101010 + A * 010101. Понятно, что оно делится на gcd(101010,010101). Понятно, что x(L+1,A) - x(L,A) = 101010, значит ответ - делитель 101010. Аналогично для 010101.
Если различных цифр было 10, например, s='qwertyuiop', то x(...) = P + O * 10 + ... + Q * 10^9. Заметим, что Q + W + ... + P = 45. Тогда x(...) = 45 + 9*o + ... + Q * (10^9 - 1). Смотрим рассуждения выше.

Задача I.

Думаю, что не решившие эту задачу зря читают этот разбор.

Задача J.

Проверим, что ответ не равен 0. Проверим, что ответ не равен 1, пытаясь жадно поменять числа местами (если оба встанут - меняем). Иначе будем думать, что это перестановка.

Пусть есть перестановка (1 2 3 4 5 ... N), т.е. массив имеет вид 2 3 4 5 ... N 1. Поменяем местами 2 и N, 3 и N - 1 и т. д. Массив будет иметь вид N N-1 ... 3 2 1. Очевидно, что полученная перестановка (1 N)(2 N-1)(3 N-2) ... может быть досортированна за один тик. Известно, что любая перестановка может быть представлена в виде произведения циклов. Проделаем подобную операцию в каждом цикле. Получим сортировку за 2.

Задача K.

Рассмотрим плоскость событий (x,t), красный свет будет на нем вертикальным отрезком. Задача - провести прямую, которая пересекает наименьшее число отрезков. Отсортируем точки "крутильной сортировкой" по углу (Upd. возможно, локальное название. Сортировка x1 * y2 > x2 * y1) и после этого пройдем последовательно и найдем участок, покрытый наименьшим числом отрезков. Видимо, важно не учитывать недостижимые по ограничению скорости отрезки (можно поймать TLE).

Задача L.

Очевидно, что каждый "маленький" цикл может быть посчитан по его двум точкам касания. Сделаем это для всех случаев. Между "маленькими" циклами ответ посчитаем, например, "разорвав" цикл перебором одной точки и потом посчитав динамику по состоянию (текущее положение, "правая" отметка на цикле), обходя его по часовой.

  • Vote: I like it
  • +9
  • Vote: I do not like it