Блог пользователя I_love_natalia

Автор I_love_natalia, 13 лет назад, По-русски

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

Примечание. Ни одну задачу не сдавал. Могут быть ошибки. Пишу как решал бы сам, что не придумал очно - спасибо 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.

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

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

В задаче Н при 10 различных буквах в слове можно решать еще проще.


Применим дважды принцип Дирихле. Применив его в первый раз, получим что не более 4 букв встречаются в слове более одного раза, или же не менее 6 букв встречается в слове ровно один раз. Применив его второй раз, поймем, что существует такая пара этих "одиночек", которая стоит рядом друг с другом. В эти две позиции поставим единицу и двойку, в остальные позиции поставим числа рандомно. Теперь поменяем единицу и двойку местами. Вычтем числа одно из другого, получим 9*10^k. Ясно, что это число делится на gcd. Но gcd не делится на 2 и 5, следовательно, gcd может быть только 1, 3, или 9.

gcd будет равно 9 только в одном случае:
abcdefghij

gcd будет равно трем в следующем случае:
aaaabcdefghij

соответственно единице-во всех остальных

PS: если что-то непонятно-обращайтесь.

PS2: немного наврал, по принципу Дирихле получается, что найдется пара, стоящая либо друг рядом с другом, либо через один символ. Но в случае, когда они стоят через один символ, разность получается 99*10^k, появляется еще делитель 11, но он тоже не будет делить gcd, мы можем таким образом подобрать замену чтобы сумма на нечетных позициях минус сумма на четных не делила 11
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Что может быть проще найти минимум в массиве? :)

    Upd. придется немного поднапрячься, чтобы закодить этот способ. Подсчетик делать, например, чтобы обрабатывать abcdedddfghij.

    Число 45 в моем описании написано для понимания, можно на 9 множить, т. к. делимость на 5 отвергается произвольностью последней цифры.

    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Неочевидность этого метода для данной задачи

      • 13 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Очевидность - субъективное понятие. Твое решение немного менее очевидно для меня :) Тот факт, что abcdefghij дает 9 из-за суммы 45 выглядит очевидно.
        • 13 лет назад, # ^ |
            Проголосовать: нравится -8 Проголосовать: не нравится
          Мое решение сводится к трем частным случаям. Проверить, является ли строка, в которой 10 символов, строкой abcdefghij(в этом случае вывести 1 3 9), является ли строка строкой aaaabcdefghij(вывести 1 3), в остальных случаях вывести 1
          • 13 лет назад, # ^ |
              Проголосовать: нравится +8 Проголосовать: не нравится
            Ветераны докладывают: неучтенный частный случай называется WA. Поэтому из решения, в котором они есть, и решения, в котором их нет, надо выбирать понятно что.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Мои случаи, во-первых, доказаны, и к доказательству особо не придерешься. То есть, конечно, это не строгое математическое доказательство, но оно правильное. В Вашем же рассуждении я не понимаю, почему это правильно. Доказать я это не могу.
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Эпичный триплпост, причем после каждой отправки жал отмену и обновлял страницу через Ctrl+F5. Печально.
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Эпичный триплпост, причем после каждой отправки жал отмену и обновлял страницу через Ctrl+F5. Печально.
13 лет назад, # |
Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

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

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


Вспомнилось:
- Ну как решить эту задачу?
- Ну понятно как!

Классно объясняете...

  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Мне кажется, что, подумав над этой задачей, человек догадывается, что означает "вытащить из пустого стека" и "добавить в стек, ничего не вытаскивая потом". Я заблуждаюсь?

    Если да, то в случае aA надо просто запомнить еще одну тарелку, во всех остальных сразу выдать невозможность ситуации.

  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Надеюсь, также можно опустить, что такую очистку за O(N) можно выполнить деком, но в лимитах этой задачи проще написать это за квадрат.