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

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

374A — Инна и розовое пони

Рассмотрим задачу о перемещении конфеты из позиции (x1, y1) в позицию (x2, y2). Очевидно, что каждым движением мы увеличиваем или уменьшаем x1 на a и y1 на b.

Тогда несложно догадаться, что если |x2 - x1| не делится нацело на a или |y2 - x1| не делится нацело на a, то добраться не возможно.

Стоит также заметить, что числа |x2 - x1| / a и |y2 - y1| / b должны быть одинаковы по парности, так как увеличение или уменьшение происходит одновременно для обоих значений.

Помимо этого, нужно отдельно рассмотреть случай, когда ход выводит нас за границы доски, это не допустимо.

Теперь мы можем определить сложность пути позиции (x1, y1) в позицию (x2, y2) как max(|x1 - x2| / a, |y1 - y2| / b).

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

374B — Инна и девять

Очевидно, что мы можем разбить задачу на подзадачи, так как если рядом не стоят цифры с суммой 9, то число будет независимо изменяться, относительно позиции между этими числами. Это значит, что мы разделим задачу на подзадачи вида x либо xyxyxyx...xyxy причем x + y = 9. Ответ для таких отрезков нужно будет перемножить, так как мы ищем общее количество вариантов.

Для x ответ 1. Что же делать с xyxyxy? Пусть длинна ее s. Тогда, если s парное, мы однозначно получаем s / 2 девяток. Если же s не парное, одна цифра (причем любая) останется. Таким образом каждая последовательность xyxyxyxyx...xyxyxy непарной длинны s увеличивает ответ в s / 2 + 1 раз.

374C — Инна и Дима

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

Запустим обход в глубину из каждой буквы D, запоминая уже обработанные позиции. Если мы попали в позицию, в которой уже были раньше (зашли в нее обходом из других D) тогда можем просто прибавить длину текущего пути к длине максимального пути из этой позиции. Длина пути, заметьте, растет нe с каждый переходом, а только с переходом в букву A. Если же мы попали в позицию, помеченную номером нашей буквы D (из которой мы начали), значит, имеет место цикл, и поиски можно заканчивать. Не забудьте также менять цвет позиции при выходе из рекурсии, иначе будет "ложный цикл", таким образом, помеченными "нашим" цветом должны быть только позиции, в которые мы зашли рекурсивно, но еще не вышли.

374D — Инна и последовательность

Заметим, что всего будет добавлено не более n чисел, а следовательно вылетов тоже будет не более n. Будем имитировать процесс с помощью структур данных, к примеру, деревом отрезков (можно и другими). Будем поддерживать количество чисел, которое есть на подотрезке. Соответственно добавление — спускаемся от корня до листа, увеличивая на единичку значения. Удаление — с точностью до наоборот. Если в левом поддереве не достаточно элементов, спускаемся в правое, иначе — в левой. Не забудьте также смещать позицию дырки на ее номер (так как вылеты у нас моментальные из всех дырок) и останавливать цикл при достижении первой дырки, позиция которой больше текущего количества элементов.

374E — Инна и пупсики

Будем делать бинпоиск по ответу (очевидно, что функция монотонная). Для каждого времени генерируем наши отрезки, и повернем их на 45 градусов так, чтобы они стали вертикальными и горизонтальными. Это можно сделать заменой (x, y)(x + y, x - y). Не забудьте слить отрезки, стоящие на одной диагонали и имеющие пересечения в один. Для этого нужно отсортировать все отрезки, и пройтись подряд, обновляя правую или нижнюю границу соответственного отрезка. Теперь осталось проверить, можно ли из текущих отрезков сложить прямоугольник. К примеру, можно перебирать левый вертикальный отрезок, поддерживая множество всех горизонтальных, которые начинаются не позже него, затем, для каждого левого вертикального перебирать правый вертикальный, поддерживая уже множество горизонтальных, которые начинаются не позже левого, но и заканчиваются не раньше правого. Теперь осталось только убедится, что есть хотя бы два горизонтальных отрезка из множества, которые, к тому же удовлетворяют еще и неравенство по y-кам.

Разбор задач Codeforces Round 220 (Div. 2)
  • Проголосовать: нравится
  • +48
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 3   Проголосовать: нравится +4 Проголосовать: не нравится

Слова парное нет в русском.

UPD Хотя там и решение неправилное..

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

По задаче B Таким образом каждая последовательность xyxyxyxyx...xyxyxy непарной длинны s увеличивает ответ в s раз да?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Подскажите пожалуйста, что я не учел в коде к задаче А или в подходе (подход как у автора)? Сижу пол часа, ориентируюсь на претест 4, и все равно не понимаю. Разбор от автора прочитал. http://codeforces.com/contest/374/submission/5466114

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

В первой задаче скорее всего надо взять минимум, а не максимум. ("Посчитаем это для всех четырех углов и выберем максимум...")

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

Насколько мне известно, слово "пони" — мужского рода, а не среднего, как в заголовке задачи A. Или это авторское изменение рода? :)

»
10 лет назад, # |
Rev. 3   Проголосовать: нравится +6 Проголосовать: не нравится

В задаче B, если s — нечётное ( s упоминается в разборе), то без пары останется ровно одна цифра, но не любая. И всего будет не s, а (s+1) / 2 всевозможных вариантов оставить цифру без пары, сохранив при этом наибольшее количество девяток. Например, в первом семпле был фрагмент "727" ( s = 3). Без пары мы можем оставить только либо первую семёрку, либо последнюю. Если оставим без пары двойку, то количество девяток, которые мы можем получить, не будет максимальным. Таким образом, каждая последовательность непарной длины s увеличивает ответ не в s, а в (s+1) / 2 раз.

UPD: теперь правильно.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In 374A why both |x2-x1|/a and |y2-y1|/b must be either even or odd??

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

    Well, you can only jump in a diagonal direction, so try drawing your way if you had to go:

    2 up and 2 left

    3 up and 3 left

    2 up and 1 left

    Only using \ or / jumps.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    let's say that u make a1 moves where u decrease x by a, a2 moves where u increase x by a, b1 moves where u decrease y by b, and b2 moves where u increase y by b. now since number of moves is independent of direction, we must have a1+a2 = b1+b2.

    now if the start point is (x1,y1) and the end point is (x2,y2), we have (x2-x1)/a = a2-a1 and (y2-y1)/b = b2-b1. adding these two results in (x2-x1)/a + (y2-y1)/b = (a2-a1) + (b2-b1).

    the above two equations tell us that the LHS of the second equation is even.

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

In problem B when the length of sequence is odd, answer must be increased in s/2+1 times. For example in xyxyxy...xyx any x can stay, and there are s/2+1 x.

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

Почему в задаче D не заходит решение 5473766? Я не понял условие или просто руки кривые? Кривые руки и не туда направленные глаза %)

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я придумал похожее решение. Почему эта идея неправильная?

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      По-моему, мы просто накосячили при вычислении k. Просто там есть несколько крайних случаев.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Хотя нет, похоже k вычисляется правильно. Тогда действительно не понятно, что не так

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      Походу я понял.

      Дима сильно стукает кулаком по столу. При этом a1-е, a2-е, a3-е, ..., ak-е числа от начала одновременно вылетают из последовательности

      Мы удаляем не первые k элементов, а a[1], a[2] ... a[k] по счету. То есть в первом тесте сначала удалится не первые две единицы, а первый и 3-й элементы (1 и 0).

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Действительно, это так, судя по правильным посылкам :)

        Надо было сразу на решения глянуть..

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For the first question: Last case: 1 5 1 3 1 1 I guess The answer exists and its 2. first step 1+1,3+1 2-1,4+1

My program gave wrong answer on test 37. http://codeforces.com/contest/374/submission/5464380

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

I have a question (may be silly) about question D, when i look at some implementations for , it seems that for most of them complexity is like O(n*m*log(n)) (segment tree/bit )*(enumerating m)*(treating n query 1by1) ,why can these passes with n,m at 10^6 scale

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    It is guaranteed that you will only attempt to access your segment tree/bit O(n) times because you can have only O(n) elements to drop.