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

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

Прошу прощения за задержку с разбором.

731A - Ночь в музее

Автор задачи: egor-belikov, разработчик: timgaripov

В этой задаче требуется реализовать то, что написано в условии, т. е. явно посчитать минимальное количество поворотов, которое нужно совершить от буквы a до первой буквы слова, от первой буквы слова до второй, и так далее. Единственное полезное знание, которое может чуть-чуть упростить жизнь, это то, что расстояние между точками x и y на окружности длины l (26 в нашем случае) можно посчитать как min(|x - y|, l - |x - y|).

Данное решение работает за O(|s|), и, конечно же, укладывается в любые ограничения.

731B - Купоны и скидки

Автор задачи: жюри олимпиады, разработчик: platypus179

Заметим, что в корректном ответе можно гарантировать, что для любых двух последовательных дней мы пользуемся не более одним купоном, покупая две пиццы именно в эти дни. Действительно, если у нас есть два купона на покупку пицц в дни i и i + 1, давайте заменим эти два купона на две скидки в дни i и i + 1.

Посмотрим на первый день. Согласно утверждению выше, мы можем однозначно определить, сколько купонов на покупку пицц в 1 и 2 дни мы используем: либо 0, если в первый день было куплено чётное число пицц, либо 1, в противном случае. Оставшиеся пиццы в этот день можно покупать по скидкам. Если мы действительно пользуемся купоном, вычтем из количества пицц во второй день единицу, и перейдём ко второму дню, повторяя те же самые действия.

Может так случиться, что в очередной день у нас и количество пицц нечётное, и в следующий день не надо купить ни одной пиццы. Это значит, что добиться требуемого одними купонами и скидками невозможно, и можно выводить "NO". Если же такого не случилось, то мы справились всё купить, используя только купоны и скидки.

Чуть-чуть подумав, можно понять, что описанное решение доказываетт, что ответ — "YES" тогда и только тогда, когда на любом максимальном отрезке из подряд идущих ненулевых чисел сумма чисел чётная.

Данное решение работает за O(n).

731C - Носки

Автор задачи: egor-belikov, разработчик: wilwell

При решении этой задачи удобно перейти к графовой интерпретации. Рассмотрим граф, в котором носками соответствуют вершины, а рёбрами соединены те носки, которые оказываются вдвоём на ногах у Арсения в какой-то день. По условию мы должны гарантировать, что любые две вершины, соединённые ребром, имеют одинаковый цвет. Это значит, что любая компонента связности в данном графе должна в итоге состоять из вершин одного цвета.

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

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

Данное решение работает за .

Дополнительный вопрос: Как написать решение, чтобы оно работало за O(n + m)?

731D - Археология 80-го уровня

Автор задачи: жюри олимпиады, разработчик: Flyrise

Обозначим за x количество циклических сдвигов алфавита, которые мы произведём. Наша цель — оформить в виде каких-то соотношений на x условие о лексикографической упорядоченности набора слов.

Заметим, что x действительно можно считать числом от 0 до c - 1, т. е., остатком по модулю c. Будем также считать, что все символы тоже имеют значения от 0 до c - 1, для этого вычтем из каждого символа 1.

Рассмотрим какие-нибудь два последовательных слова в списке. Возможно два варианта, соответствующих двум случаям в определении лексикографического сравнения:

Во-первых, может существовать такая позиция, что эти слова отличаются в этой позиции, а до этой позиции совпадают. Пусть, скажем, в этой позиции у первого слова стоит значение a, а у второго -- значение b. Тогда эти слова будут идти в лексикографическом порядке тогда и только тогда, когда . Нетрудно видеть, что если представить все остатки по модулю c в виде окружности, то это условие задаёт дугу на этой окружности. Таким образом, эта пара последовательных слов даст нам условие вида "x принадлежит к некоторой дуге на окружности".

Во-вторых, такой позиции может не существовать, т. е. одно слово может быть префиксом другого. Если первое слово префикс второго, то эти два слова всегда идут в лескикографическом порядке, вне зависимости от выбора x. В противном случае (второе слово является собственным префиксом первого), мы ничего не можем поделать с этими двумя словами, и они никогда не будут идти в лексикографическом порядке, т. е. можно сразу выводить ответ  - 1.

Теперь нам требуется определить, есть ли какая-то точка, лежит на всех дугах из заданного набора, или нет. Пусть у нас образовалось k условий, задающих дугу. Разорвём окружность, представив её в виде отрезка от 0 до c - 1. Каждая дуга превратится либо в один, либо в два подотрезка этого отрезка (в зависимости от того, содержала ли дуга числа 0 и c - 1 или нет).

Теперь мы должны проверить, есть ли точка, накрытая ровно k отрезками. Это можно сделать разными способами, например, можно прибавить единицу на каждом из этих отрезков с помощью какой-то структуры данных, или без её использования, поставив в начало каждого отрезка 1, а в точку после конца каждого отрезка  - 1, и перейдя к префиксным суммам. А можно выписать все события открытия или закрытия какого-то отрезка, отсортировать по координате, и пройти слева направо, поддерживая количество открытых отрезков. Если в какой-то момент у нас имеется ровно k открытых отрезков, то ответ — "YES".

731E - Веселая игра

Автор задачи: meshanya, разработчик: ipavlov

Для начала хочется дать небольшой комментарий по данному виду игр. В большой науке игра, в которой двое игроков максимизируют разность между своими очками и очками соперника называется "игра с нулевой суммой". Стоит запомнить, что задачи на данный вид игр очень часто решаются с помощью динамического программирования общего вида, которое мы сейчас опишем в решении.

Заметим, что в любой момент игры на первом стикере будет написана сумма чисел на каком-то префиксе исходной последовательности чисел. Это значит, что состояние игрового поля описывается одним-единственным числом i: длиной префикса чисел исходной последовательности, которые были просуммированы в одно число.

Выскажем два соображения. Во-первых, для каждого состояния i ход, которым будет пользоваться игрок, оказавшийся в этом состоянии, не зависит от количества очков на счету у игрока и у его противника. Действительно, в любой момент игры можно не думать об очках, которые есть на счетах у игроков сейчас, потому что они дают какой-то константный вклад в итоговую разность очков, если мы мысленно занулим количества очков на счетах игроков на текущий момент. Таким образом, всё, что надо знать про состояние i -- это какая разность будет между очками игрока и между очками его противника, если бы игра начиналась с состояния i с нулевыми очками.

Во-вторых, игра симметричная, т. е. то, какой ход совершит игрок, оказавшийся в состоянии i, и с какой разностью очков в итоге закончится игра, не зависит от того, какой именно игрок оказался в этом состоянии.

Обозначим за D[i] разность очков между счётом первого игрока и счётом второго игрока, если бы игра начиналась из состояния i с нулевыми очками.

Удобно размышлять об этой игре, считая, что у игроков нет своих очков, но есть чиселнный баланс между ними, и первый игрок прибавляет на своём ходу какие-то числа к этому балансу, а второй вычитает. В таких терминах D[i] это изменение баланса к концу игры, если текущий игрок стремится его максимизировать, и сейчас он находится в состоянии i. Ответом на задачу будет являться, как несложно понять, число D[1]. Заметим, что если бы текущий игрок стремился минимизировать баланс, то, в силу симметричности игры, итоговое изменение баланса из состояния i бы составило  - D[i].

Посчитаем все D[i] с помощью динамического программирования. В конце игры, т. е., в состоянии n значение D[n] равняется нулю, потому что игроки больше не будет совершать ходов, а значит, баланс не будет претерпевать изменений.

Пусть сейчас у нас какое-то состояние i. Переберём, сколько стикеров себе возьмёт текущий игрок. Если он возьмёт стикеры, заканчивая j-м (в исходной нумерации), то он изменит баланс на S[j] (пуолчит именно столько очков, где S[j] — сумма первых j чисел в исходной последовательности), а игра окажется в состоянии j, значит, его противник после этого добавит к балансу ещё  - D[j] (обратите внимание, что знак изменения баланса меняется, потому что из нового состояния будет уже играть противник, а он меняет баланс в другую сторону).

Значит, итоговое изменение баланса при совершении описанного хода будет S[j] - D[j]. В определении динамики мы играем за игрока, стремящегося максимизировать баланс, значит, .

Эта формула даёт нам решение за время O(n2), но не трудно видеть, что, достаточно поддерживать максимум величины S[j] - D[j] на суффиксе j > i, пересчитывая его за O(1) при уменьшении i. Таким образом, мы получаем решение за O(n).

Дополнительный вопрос: какой тип данных надо использовать для хранения D[i] (и ответа, в частности)?

731F - Видеокарты

Автор задачи: жюри олимпиады, разработчик: vintage_Vlad_Makeev

Первым несложным соображением является то, что при фиксированной ведущей видеокарте мы можем смело брать все видеокарты такой же или большей мощности, так как каждая из них даёт строго положительный вклад в итоговую мощность. Значит, можно отсортировать карты по возрастанию мощности, и считать, что мы всегда берём какой-то суффикс видеокарт в этой последовательности.

Зафиксируем мощность ведущей видеокарты x. Суммарную мощность при таком выборе можно записать как . Заметим, что под знаком суммированиия стоит число, с одной стороны, строго делящееся на x, а с другой — не превосходящее 200 000. Значит, различных значений, которые участвуют в этой сумме, не больше . Попытаемся посчитать значение этой суммы за сложность, пропорциональную количеству различных слагаемых в ней.

Для этого надо понять для каждого из значений x, 2x, 3x, ..., сколько видеокарт будут в итоге давать ровно такую мощность. Это несложно: в итоге мощность kx окажется ровно у всех видеокарт, которые обладают мощностью от kx до (k + 1)x - 1. Их количество можно определить за O(1), если построить массив C[i], который хранит количество видеокарт каждой мощности, и посчитать на нём все частичные суммы.

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

Значит, мы получили решение за сложность , где m -- максимальная из мощностей видеокарт.

Дополнительный вопрос: Возникает соблазн написать неправильное решение, которое предполагает, что оптимальная мощность всегда находится среди первых, скажем, 100 мощностей в порядке сортировки. Как построить тест, в котором оптимальная мощность находится, скажем, между одной четвертью и тремя четвертями отсортированного списка мощностей, т. е. тест, который валит описанное решение?

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

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

How to solve E if it was modified by "Instead of replacing first k ≥ 2 stickers by a new stricker S' with value of their sum, we replace S' by first two stickers only."

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

I got stuck with problem C because I completely missed the he has to finalize the colors now. part. I thought we could change the colors more than once.

Any idea how to solve this problem in a reasonably amount of time if it's valid to change the colors more than once, i.e., every day you can choose to change the colors as needed? Not surprisingly I couldn't come up with a good idea.

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

По задаче С

Пожалуйста объясните, как быстро считать максимальный цвет в одной компоненте связности? Моё решение с карманом не проходит по времени (TLE тест 32) из-за необходимости обнулять карман для каждой новой компоненты, но как делать иначе я не придумал.

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

Can someone give a better explanation for problem-D. I was not able to follow the editorial that well. Thanks !

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

    Imagine that you have only 2 sequences. You'd calculate the set of non-negative integers A, that for every if you perform a changes, then the first sequence is lexicographically not greater than the second. Then you do this for every n - 1 pairs of sequences (the 1st and the 2nd, the 2nd and the 3rd, the 3rd and the 4th, and so on...), so you calculate A1, A2, ... An - 1 sets. The answer is in the set , if it's empty then answer is  - 1.

    For more information how to deal with sets, check out my submission: 21613184 (basically you make an array and use partial sums)

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

Any one found anything greedy for the E?

i tried either taking all the numbers on the first step or taking the first n-1 numbers , got WA

can't find a case where the difference between both answers will be larger than the difference of either all the array and 0 or forcing the enemy to take a negative value then forcing him on the last array number,

But this doesn't seem right....

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

Another (more complex) idea of problem E.
Sort all values, than calculate res[i] — answer for videocardi like leader.

N = a * b, so that
We iterate over videocards and want to do no more than operation per one. There are two cases:
1) Current videocard is leader. We assign xi like a and try .
2) Current videocard isn't leader. We assign xi like N and want to add xi to some leader videocard, where . So try
There is basic idea. You can check my solution for more details or ask me

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

can anyone help me with the F I am not able to understand it

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

It seems that I solved DIV 2 C (SOCKS) problem same way as mentioned in editorial but getting TLE on test #33. Any suggestions for optimization?? or is my solution wrong?? Any help is appreciated. Thanks

My Submission

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

    my tle submission — tle my ac submission — ac

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

      Thanks, got it accepted by inserting colors in the set and then resetting count array to zero. But shouldn't this approach be slower than the last one? We have inserted n elements in set in O(N log N) time, whereas the previous approach took only O(n) time. Why was it getting TLE then??? Again, any help will be appreciated.

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

        In tle solution, every time I visit a non-visited node, I am assigning tot[node] to zero for all node, which is taking O(n) time. Suppose you have to perform bfs n/2 times then, you running time complexity would be O(n^2). But after inserting values in set,I only have have to assign those values to zero which I have visited in current bfs operation .

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

          Wow...!! Never thought of that. I always ignored initialisation during analysis. Thanks. Something good came out that TLE.

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

          I think, best way to do this is to use map and clear the map after each dfs, it takes less memory than total memory of array and set. Correct me if I am wrong.

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

In E, tc 2 4 1 -7 -2 3 move 1, petya takes 1 -7 score p -6 g 0 seq -6 -2 3 move 2, gena takes -6 -2 3 score p -6 g -5 game ends diff -6 — (-5) = -1 what's wrong? -1 is better than -3

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

what is the greedy implementation for C, and how on earth we came around graph on reading this problem?