Автор frost_nova, 14 лет назад, По-русски
Мы рады приветствовать всех участников отборочного этапа “Яндекc.Алгоритм 2011 - Раунд 1”.

Авторами сегодняшнего тура являются сразу несколько человек, а именно: Виталий Гольдштейн, Игнат Колесниченко, Станислав Пак и Денис Ярец. Все мы являемся сотрудниками или интернами компании Яндекс. Мы очень признательны Артему Рахову, Марии Беловой и Михаилу Мирзаянову за оказание помощи в подготовке задач. Надеемся, наши задачи окажутся интересными и понравятся вам.

Как вы наверное уже знаете, по результатам сегодняшнего отборочного раунда определятся 200 участников, которые продолжат борьбу за право участвовать в финале чемпионата.

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

Раунд будет учитываться в рейтинге как для официальных участников отборочного этапа, так и для тех, кто не прошел квалификацию и участвует вне конкурса.

Желаем всем удачи и высокого рейтинга!

Контест завершен. Всем спасибо за участие! Особые поздравления победителю раунда tourist и 200-ке лидеров, вышедшей в следующий тур. Ждем вас на заключительном отборочном раунде послезавтра.

Разбор задач:  С, E
  • Проголосовать: нравится
  • +116
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Feature request:
Неплохо бы было видеть список зарегистрировавашихся только в конкурсе
14 лет назад, # |
  Проголосовать: нравится -20 Проголосовать: не нравится
По-видимому, не все хотят соревноваться за выход в следующий тур. Пока заявились по конкурсу только 716 человек, и, похоже, успеют не все
  • 14 лет назад, # ^ |
      Проголосовать: нравится +7 Проголосовать: не нравится
    ну это же личное дело каждого

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

    я, например, сегодня вот зачёт прогуливаю из-за контеста =)
    • 14 лет назад, # ^ |
        Проголосовать: нравится -9 Проголосовать: не нравится
      У вас зачет в 7 вечера? о_0:) Суровые у вас преподы:)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится
        Может это и не относится к Alex_KPR, но еще разные часовые пояса бывают..
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        ну вообще не только по причине зачета можно не написать этот раунд... не  все же учатся в универе
      • 14 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится
        отличный момент, чтобы прорекламировать родной ВУЗ =)

        зачёт по организации и планированию производства начался в 18:30, пойду в понедельник на пересдачу :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да не, наверно, дело в том, что кто-то не писал квалу. Майк же ведь говорил, что опцию участвовать ради прохождения, но не ради рейтинга, в ближайшее время делать не собираются.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Неплохо бы при назначении тегов писать и русскую, и английскую версию для удобства поиска. А то так: http://mirror.codeforces.com/search?query=yandex одно, а так: http://mirror.codeforces.com/search?query=%D1%8F%D0%BD%D0%B4%D0%B5%D0%BA%D1%81 другое.
14 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится
А почему на главной отображается нулевое количество комментариев? Или это опять старый баг, который я только заметил? =)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    В прямом эфире тоже нарисована стрелочка "текст создан или обновлен"
    Видимо связано с отрезанием функциональности.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Неа, во всяком случае я такого не помню. Забавный баян:)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Каюсь, я переусердствовал с кэшированием. После контеста исправлю.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      По-моему кол-во участников в контесте тоже не обновляется на страничке /contests/.
14 лет назад, # |
  Проголосовать: нравится +15 Проголосовать: не нравится
Good luck & Have fun!!
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
На чем все ломали C?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    скорее всего на том, что корень не обязан быть вершиной с номером 1
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Меня на квадратичном решении %)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На дереве высоты O(n)
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      А как такое возможно? У нас же должно быть полное дерево поиска, высота для него логарифм
      UPD Понял...жаль, что на контесте не дошло
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Не сказано, что оно сбалансированное.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Дано какое-то двоичное дерево поиска, не обязательно сбалансированное по высоте
14 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится
Today I learned Yandex really likes trees! (And so do I, so I enjoyed today's problem set.)
14 лет назад, # |
  Проголосовать: нравится +15 Проголосовать: не нравится
I liked watching the top 5 challenging each others at the last few minutes! Especially RAVEman and tourist! :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I wrote a test case generator for hacking for the first time (for Problem C), but I got an "integer 0 out of range [1, 1000000000]" error.

Any ideas why?

Here's the code: http://pastebin.com/79PFDzrG
  • 14 лет назад, # ^ |
      Проголосовать: нравится +20 Проголосовать: не нравится
    The problem statement says "positive integer", so you need to change from '                        System.out.println(i);' to '                        System.out.println(i+1);' in line 24
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Thanks!

      Too bad, that would've been the difference between qualifying and not qualifying :/
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    In the last loop, you print out "0", which is not allowed (any positive integer).
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Does anybody know the pretest 4 for problem C?
What I did was a dp[position][didMistake] for each number.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Научите читать задачи!! О_о
14 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
No one can beat tourist! Hard luck RAVEman.
14 лет назад, # |
  Проголосовать: нравится +44 Проголосовать: не нравится
Very fast system test! in 13 minutes only :)
14 лет назад, # |
  Проголосовать: нравится -35 Проголосовать: не нравится
Пора мне на пенсию))
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Задача Б оказалось слишком хитрой =( 

Какая асимптотика правильного решения и идея? Подскажите.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я решал 4-мя мультисетами. Сложность O(NlogN). Просто в каждый момент времени выбирал человека с наименьшим временем и которого можно протолкнуть дальше и проталкивал.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      у меня решение с очередями за O(N)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да. Они всегда в очередях будут отсортированы. Но я как-то не подумал :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        с очередями или приоритетными очередями за NlogN ?

        если действительно за O(N)  то как именно?
        • 14 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          с очередями, без приоритетов всяких

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

          посмотрим, когда чувак попадет на первую обработку. в очереди храняться моменты, когда заканчивается обработка очередного чувака. если размер ее меньше, чем k1,то значит, есть окошко, куда можно его сразу пропихнуть, иначе он пойдет в первое освободившееся окошко, т.е. в момент времени q1.front() и мы вынимаем первый элемент из очереди, и в любом случае добавляем себя. и так для всех трех очередей. Понятно, что в очередях элементы всегда будут возрастать, а значит, сет или чтото подобное ненужно
          • 14 лет назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится

            Зачем вообще очереди? :)

            Просто вычисляем время окончания обслуживания j-го человека на i-ом шаге di, j, как время начала обслуживания плюс ti.

            А время начала - это максимум из времени окончания обслуживания j-го человека на i - 1-ом шаге (di - 1, j) и времени окончания обслуживания j - ki-го человека на i-ом шаге (di, j - ki), если такой человек существует.

            Ну и d0, j - просто время прихода.


            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              логично =) просто на контесте первая мысль - очереди
              • 14 лет назад, # ^ |
                  Проголосовать: нравится +18 Проголосовать: не нравится
                Иногда на контесте главное - отогнать подальше первую мысль :)
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      ну у меня 3 мультисета и 1 сет. Идея точно таже, но на 8 тесте ТЛ(
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Можно сделать тремя очередями, обрабатывая людей в порядке прихода. Достаем всех, кто уйдет до того как мы придем, потом ждем пока освободится окошко.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Решал бинпоиском по ответу
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    Обслужываем клиентов в порядке прихода. По очереди обрабативаем 3 типа касс и после каждого храним новые времена прихода. Свободны касси храним в сете и выбираем ту которая освободится раньше всех.

    Извините за неграмотность.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Я за линию делал. В начале считаем что к первому окошку люди подходят с теми временами, что даны в условии. Потом симулируем работу первого окошка, получаем времена выхода людей из него и даем это на вход второму окошку и т.д..
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      I have O(n) too
      for each person I immediatly count when he end first, second and third window do it in O(1)
      thats all

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

    1) Для каждого человека посчитаем, когда он закончит "обрабатываться" на инстанции 1,2,3
    2) Заметим, что люди будут вставать в очередь следующим образом: пусть есть три кассы и 8 людей. Тогда для первой кассы 1,4,7; для второй 2,5,8; для третьей 3,6
    3) Понятно, что худшее время будет для последнего
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Разве всегда для последнего худшее время?
      Например
      1 1 1
      1 1 1
      3
      1 1 10
      Последний будет 3, а второй 4
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    За о(n), жадник. Храним для каждого окна, когда оно освободиться и все, а для каждого человека будем выбирать либо свободную, либо если таковой нет, выбираем самую первую, которая освободиться. Храним все это 3-мя очередями.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Либо сделать 4  приоритетные очереди -- одну для всех событий и ещё по одной для людей, ожидающих у каждого окошка. Это
    Либо заметить, что можно обработать окошки независимо и каждому следующему подавать на вход времена, в которые люди вышли из предыдущего. Это линия
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Вроде бы написал так же 4 очереди. Не посмотрите в чем косяк?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вроде бы, неправильный компаратор -- при равенстве времён сначала нужно обрабатывать тех, кто ушёл, а потом тех, кто пришёл.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Хм, вроде бы если время совпадает, то если тип меньше(то есть окно освобождается) я делаю раньше.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А, точно. Тогда ответ в int не влазит.
            • 14 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
              там дефайн чуть выше, должно в 64битном типе считаться

              • 14 лет назад, # ^ |
                  Проголосовать: нравится +1 Проголосовать: не нравится
                Ого, и правда дефайн. Надо же так обфусцировать-то.
                 Тогда не знаю. Посмотрите тест, он же есть в дорешивании.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

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

    Заводим очередь, в которую будем класть время выхода с этапа очередного человека. Теперь просматриваем всех людей в порядке их прихода на этап. Сначала удаляем из очереди всех людей, у кого время выхода с этапа меньше или равно времени прихода нового человека (они идут в начале).Теперь если в очереди меньше k элементов, то человек будет обслужен сразу после прихода его на этап, поэтому кладем его в очередь, добавив к его времени прихода время обслуживания t. Иначе удаляем из очереди начальные элементы, пока в очереди не останется k-1 элемент - время удаления последнего элемента и будет время, когда начнут обслуживать очередного человека, к нему тоже добавляется t и кладется в очередь.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    3 раза решаем одну и ту же задачу - куча народа с некоторыми временами прихода, и k касс с фиксированным временем обслуживания t.

    Будем поддерживать счетчик количества доступных касс. Теперь идем по всем чувакам. Если есть свободная касса, то сажаем этого чувака туда и пересчитываем ему время выхода. Если сажать некуда - вытаскиваем из касс чувака с наименьшим номером (иногда надо подождать до его времени выхода) и сажаем в освободившуюся.

    Можно доказать, что времена выхода чуваков тоже будут идти в порядке возрастания, как и приходы (т.к. все одно и то же время обслуживаются). Итого ничего не надо сортировать. Решение за O(n).
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Я единственный с деревом отрезков делал?
    Если каких-то касс больше чем людей, понятно, дерева не надо, к данному типу касс очереди не будет.
    Иначе в вершине дерева храним во сколько освободится следующая касса.
14 лет назад, # |
  Проголосовать: нравится +51 Проголосовать: не нравится
Как обидно быть 201м...
14 лет назад, # |
  Проголосовать: нравится -13 Проголосовать: не нравится
А меня взломали некорректным тестом! В дорешивании задача сразу сдалась, а в комнате - взлом =(((
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    Из того, что задача проходит систесты не следует, что взлом некорректный вроде бы
  • 14 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    Почему же сразу некорректным? Просто его не было в тестах жюри
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Задача D. Подозреваю, что чел запихнул в множество сразу два одинаковых числа....
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А чем это плохо по условию?
        • 14 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          Тем, что условием это запрещено, и мое решение серьезно на это опиралось
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Честно сказать, запрет вижу только в неравенствах, но во входных данных не вижу. Поэтому не рисковал и сделал с дублями..

            • 14 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится
              "Для любой операции add x верно, что элемент x непосредственно перед операцией не входит в множество." (С)
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Ух ты... Действительно... Извини, не заметил ни на контесте, ни сейчас) Тогда да, нехорошо, если таким тестом ломали)
                • 14 лет назад, # ^ |
                  Rev. 2   Проголосовать: нравится -18 Проголосовать: не нравится

                  Вот-вот. А компания "Яндекс" на меня положила - на мои запросы никто попросту не реагирует. Разумеется, проще считать, что ничего не случилось - меньше гемора.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится
        это очень наврядли, каждый взлом проверяется валидатором
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Не поленился и посмотрел - там тест из 1го sum
        Так что не делайте поспешных выводов
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну так на этом мое решение без проблем работает
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Хотя нет, извините, это был последний претест
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Это может быть недостатком системных тестов.
14 лет назад, # |
  Проголосовать: нравится +61 Проголосовать: не нравится
I was very lucky. 20 seconds before the end of the contest I've solved only A, but I qualified!
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Why did you not try B,C,D? 
    • 14 лет назад, # ^ |
        Проголосовать: нравится +14 Проголосовать: не нравится
      B and D looked very hard for me. I thought A + C is not enough to qualify, so I decided to solve E.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +11 Проголосовать: не нравится
        Congratulation!

        In my opinion, today's problem is a little strange.
        And the statements is too long, I have to read it more than once to get the right meaning.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Problem B seemed interesting though i couldnt solve it. Can anyone share the idea?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I just simulated using 5 deques.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Prove that the i'th person who arrives for first action its optimal for him to go to window i mod k1. And the same for actions two and three. Then simulate this. (I did this way, don't know about others...)
14 лет назад, # |
Rev. 9   Проголосовать: нравится +7 Проголосовать: не нравится

Разве претест 3 в задаче C корректен? Он таков. 



5

2 5

-1 10

1 3

1 7
 

2 15

6
 
1

4

6

8

11

20 

Ответ безразличен, поскольку само дерево - не есть бинарное дерево поиска, на мой взгляд.
  • 14 лет назад, # ^ |
      Проголосовать: нравится -25 Проголосовать: не нравится
    да, фейл
    и непонятно чего с этим делать, так как
    1. Это влияет на ход контеста
    2. 2й раунд уже послезавтра
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да уж. Сам полтора часа пытался найти ошибку в задаче, очень много потерял на ней. Так и не сдал :(
    • 14 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      Дерево является бинарным, а по условию корень не обязательно в 1, так что все ок.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +6 Проголосовать: не нравится
           10
        5     15
      3  7
      Вроде бинарное дерево поиска.
      Разве нет?
    • 14 лет назад, # ^ |
        Проголосовать: нравится +21 Проголосовать: не нравится
      Мне больше не наливать дать выспаться
      Не заметил первой второй строчки в тесте
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        2
       / \
      1 5
     / \
    3 4
    как то так.
    корень не обязан быть с номером 1:)
    UPD. немного подредактировал мой ascii-арт...
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Нормальный, корректный тест. Что Вас смущает-то?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

    такое дерево получается:
    10
    |   \ 
    5  15
    | \ 
    3 7
    И что в нем некорректного?)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +11 Проголосовать: не нравится
      Тесты из условия вполне проходились с неправильным пониманием задачи - что нумерация вершин стандартная. Полностью моя ошибка, да, но желательно было бы в условиях или примерах отражать такие моменты чётче. Хотя, может, я один на этом прокололся.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Почему место в Яндекс.Алгоритм 2011 - Раунд 1 на графике с моим рейтингом указывается с учетом участников выступавших вне конкурса?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
ИМХО D намного проще B и С.
Гарантируется ли что сложность A<B<C<D<E ?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    по-моему количество решивших - лучший показатель, и если на него посмотреть, то все ок: x793x461x178x137x19
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Не каждый умеет быстро писать декартово дерево. По крайней мере я других решений не знаю.
      • 14 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится +16 Проголосовать: не нравится

        SQRT - декомпозиция.
        Почти всегда можно ее вместо дерева загнать --- и тут можно было, 250мс на макс тесте
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Оффлайн и обычное дерево интервалов же
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ух ты, а можно подробнее?
          • 14 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

            Храним в каждой вершине ДО количество "активированных" чисел в поддереве, а также сумму всех, которые по модулю 5 по номерам в данном отрезке равны 0,..,4. Обновление очень простое:
            sum[v][mod]=sum[left[v]][mod]+sum[right[v]][(mod+5-count[left[v]])%5]
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              А можно немного описать происхождение формулы, если конечно не сложно. Просто мне не понятно почему вычисление не симметрично для левого и правого, не понятно зачем добавлять там 5, если берём по модулю той же пятёрки, она же никак не повлияет.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится +1 Проголосовать: не нравится
                ===============================
                Окей. Итак, пусть у нас в левом поддереве 7 элементов, в правом 6. Тогда остаток 0 по модулю 5 будут давать 0, 5, 10 (о-бейзд) числа в отрезке. 0 и 5 - это просто 0 и 5 в левом подотрезке. 10 - это 3ий элемент правого подотрезка,, то есть все элементы, кратные 5 в общем отрезке, дают остаток 3 в правом отрезке. ( Потому что они сдвинуты небольшим хвостиком левого отрезка, 5 и 6ым элементом)ю
                В общем: если слева Х элементов, то первый элемент из правого подотрезка, который нам подходит ( его номер делится на 5) - это элемент правого отрезка с номером (5-Х)%5, потому что Х%5 - это хвостик левого подотрезка, который сдвигает нумерацию в правом.

                Ну и та же формула верна для любого остатка М:
                Элементы с остатком М слева и элементы с остатком  (5-Х+М)%5 справа, где Х - кол-во элементов слева.
              • 14 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

                Уже объяснили более развернуто.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Успел прочитать, было тоже вполне доходчивое объяснение, спасибо. 
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Поподробнее, пожалуйста, про обновление. Я так до него и не дошел:)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            см. моё или ACRush, вроде там самоочевидно
      • 14 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        У автора ветки чистый квадрат, если я ничего не перепутал. Так что D - халява.
        • 14 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          sum находится линейно, а add и del за логарифм. Учитывая ограничения, мне показалось не логичным описать сложную структур =)
          Вы правы, мне подсказали, что insert в vector работает за O(N). Так что чистый квадрат)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Вообще то sum находится много раз и поэтому тоже работает за n^2.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Понятие сложности субъективно. Как можно гарантировать это?

  • 14 лет назад, # ^ |
      Проголосовать: нравится +24 Проголосовать: не нравится
    Проблема в том, что автор этой ветки написал за квадрат и у него прошло за 1830мс :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    Гарантируется что сложность такая по мнению авторов.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
For each window, you save when a person can reach it the first time. This is the maximum of the time the person arrived (or did go to the window before) plus the time it takes for that window and the time the kth person before him finished plus the time it takes for that window.
14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Е точно была проще D
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да, а выше писали что D намного проще B и C. Выходит что Е - вторая по сложности задача на контесте? :)

    Сложность нельзя оценить объективно и уж точно нельзя так категорично заявлять, особенно если Е сдало в 7 раз меньше людей, чем D.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +26 Проголосовать: не нравится
      > особенно если Е сдало в 7 раз меньше людей, чем D.
      Наверное, это тоже не слишком хороший показатель, так как многие читают задачи исключительно по порядку, и решают их тоже по порядку. Плюс ещё психологический фактор в духе "да ну, это же Е, наверняка там что-то очень замысловатое". Уверен, что если бы поменять местами D и Е, то разница была бы совсем другой, но это никак не проверить, конечно =)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Кстати, расскажите тогда как ее решать, очень интересно.
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Пусть мы знаем ответ. Тогда построим граф (на самом деле его не надо будет строить)
      где ребро между парой вершин есть если их расстояние > ответа. Тогда все пары которые соединены ребром должны относиться к разным генералам т.е. - быть разных цветов. Такая раскраска возможна только, когда граф двудолен. Будем добавлять ребра от самых длинных к более коротким (их можно отсортить сортировкой подсчетом) и смотреть нарушилась ли двудольность или нет. Как тока нарушилась, то мы нашли ответ. А второй параметр ответа это просто 2^(число компонент связности)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Черт, это и вправду очевидно. Но по мне так и С очевидна, и декартово дерево в D, хотя его писать однозначно дольше.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          А можно подробнее о декартовом дереве ?
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Декартовое дерево умеет считать любую функцию, которую можно пересчитать, зная что-то про детей. Собтсвенно, как и дерево отрезков, но декартово еще при этом иногда перестраивается.

            Я считал две функции - количество детей в поддереве (пересчитывается очевидно), и для каждого остатка по модулю пять сумму ключей в таких позициях.
            Пересчитывать тоже очевидно: перебрали остаток в ребёнке, посмотрели, сколько слева (либо 0, если левый ребёнок, либо 1 + sz[right], если правый) и прибавили туда.
14 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
Is everyone going to post their solutions for B ? :) They all look the same and it's not interesting.

I think C and D are much more interesting to discuss.

In D I used  N*Sqrt(N) algorithm which looked obvious to me. The most popular approach was cartesian tree.  Some others used Interval trees.

I think C was harder than D. I looked at some passed codes and they look like O(N^2), but I am not sure.


  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    I made a solution for C using Fenwick Tree and I haven't seen any solution like mine :D
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      In C I also can't find the solution similar to mine :)  I saw some easier solutions.

      Still, D allowed much more different solutions and therefore, it was easier than C in my opinion.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        I've got a segment tree solution for problem D. It's an offline algorithm, I find all values which I can have. Then I sort and take the unique elements. This is the reference array for my segment tree. The actual array for the segment tree is a boolean valued array, which represents if the i-th element exists in the set or not.
        I run a dp/segment tree kind of query from the root for each sum query. I compute the number of elements in the left subtree (using another count dp/segtree). The the offset for the right subtree is (parentOffset + left)%5
        In this way I get the list of all elements in log(n)

        For every update, I start at the leaf and proceed towards the root, unsetting all the dp values.

        I liked this idea, it was going around in my head for a while, finally implemented it today :) 
14 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится
В задаче B: Количество окон до 109. Спасибо, ёлки-палки, за дополнительный контест по бисерочитанию условия!!

Блин. Нет, ну конечно же, я сам себе злобный буратино (не отрицаю), что завёл массив размера, равного количеству окон. А вот те, кто не задумываясь заводит эти (цензура) ужасные массивы var a: array[0..100010] of integer и int a[100010], оказались в выигрыше! :-(((

А так, спасибо за контест! :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    И зачем они делают по 100010? Я вот на 105 пишу 100500...
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    можно было создавать очереди по числу народу, тоже не пришлось бы 100500 писать
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Можно, можно...

      Но я к тому, что места для взломов должны возникать из-за алгоритмической сложности задачи или из-за интересных, нетривиальных тестов... а не тупо из неестественных ограничений!
14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Только мне кажется неправильным, что в D проходит квадрат? Я не хочу утверждать, что это недопустимо, но если авторы хотели сделать, чтоб прошел квадрат, зачем ограничения до 100000?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Думаю это ошибка авторов. Не думаю что стоит сильно обращать внимание - на результаты контеста это не сильно повлияло. Чтобы такое реже случалось надо добавлять к тестам взломы, но видимо тогда результатов тестирования придется ждать несколько часов.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Будем набирать набор хаков постепенно в течение всего контеста. Если решение хакнули, тестируем его на хаках из набора, и если все тесты проходят успешно, добавляем хак в набор.

      Думаю +10-15 хаков к каждой задаче не убьют систему.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, и еще вопрос. Это проблема ограничений или тестов? А то у меня решение очень уж слабо отличается от квадратичных по времени выполнения. Обидно даже.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В D - возможно ограничений. Там в квадратичном решение всякие /5 возникают на самом деле, а квадрат от 20000 это не сильно и много то в общем-то для 4-ех секунд(или их там было 3?). Но в С - однозначно косяк тестов.
14 лет назад, # |
Rev. 2   Проголосовать: нравится +10 Проголосовать: не нравится

Кстати о камшеках в огород тестов:

Я внезапно обнаружил, что  у меня решение С за квадрат. (каждый раз проходом определял границы массива ключей, которые попадают в текущий отрезок). 880мс. Не то, чтобы я против, но все же)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Так Вы попросите админов, чтобы взломы в тесты добавлялись, - и всё справедливо будет :)
  • 14 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

    Тут не в тестах проблемма, а в компах ---  как-то все очень шустро летает.
    Вон --- и по D у человека прошел квадрат.
    А в прошлый раз я словил бревно пытаясь хакнуть человека с 10^9 за линию.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +18 Проголосовать: не нравится
      Компьютеры на codeforces настолько быстры, что не только тестирование длится около 15 минут, но и проходят асимптотически неверные решения.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        Пользуясь случаем, хочу спросить у администрации: есть ли в планах проверять задачи на полном наборе тестов по ходу контеста? И если есть, то в насколько близких планах оно находится. Большое спасибо.
14 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
Problem E may be too easy.
Just a little bit tight time limit.
An easy o(n^2 log n) solution with small time constant can pass ...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Yes, it may happen because of necessity to double a working time of a reference solution written in Java, that is why a few optimized O(n2 log(n)) C++ solutions have managed to pass system tests. We are sorry for that. Planned asymptotic is O(n2), but there is O(n) solution.
14 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится
Долго думал почему у меня не проходит задача В, пока не посмотрел на строчку #define INF 10^9.
14 лет назад, # |
Rev. 4   Проголосовать: нравится -32 Проголосовать: не нравится

Блин, полнейшее свинство!!! За 5 минут до конца начал сдавать Е, словил МЛ 1.
В дорешке выяснилось, что решение абсолютно верное, только чтобы оно прошло, требовалось
1). Резервить векторы по Н
2). Делать массив расстояний ломанным (a[i]=new int[i+1])
3). Хранить вместо тройки (пара вершин ребра, длина) число (вершина1*н+вершина 2).
И при этом зашло с 246мб памяти.

Я понимаю, что может массив расстояний можно было вообще не хранить а подсчитывать на лету, и может авторка юзает линию памяти, но было бы хорошим тоном позволить участникам писать хотя бы в пределах 512мб, учитывая, что решения имеют одинаковую ассимптотику и учитывая объемы данных задачи((
  • 14 лет назад, # ^ |
      Проголосовать: нравится +18 Проголосовать: не нравится
    Короткевич в 1 mb уложился
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Это делает ему честь. Но никаким образом не означает, что все остальные тоже должны использовать 1мб)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      offtopic: а где-нибудь есть статистика по сданным решениям конкретной задачи? у меня не получилось найти.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        В контесте, если нажать на количество решивших, то можно получить некоторую статистику. Есть сортировка по параметрам.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Добавлю, что направление сортировки можно менять изменяя ASC на DESC в строке адреса.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    Странно, что 256мб не хватало, авторские решения использовали куда меньше памяти (порядка 100мб), поэтому мысли о том, что 256мб не хватит практически не возникало...
    • 14 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Еще раз подумав, хочу извиниться, я, наверное, чересчур резко прореагировал, потому что решение было верным. В конце концов, если ТЛ увеличивают в 2 раза, ориентируюясь на кривые руки участников, то почему бы не делать то же с Млом?..
      Просто как-то расстроило, что с ТЛом проблем в общем не было, а с МЛом пришлось так извращаться, кодя в общем-то здравое вполне решение.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        ML гораздо легче предсказать и подсчитать -  гораздо очевиднее TL'я.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Собственно он и был увеличен в 2 раза, даже в 2.5.
        • 14 лет назад, # ^ |
            Проголосовать: нравится -8 Проголосовать: не нравится
          Ну, на самом деле он не был кастомно увеличен в 2.5 раза, он был просто оставлен стандартным) Но, в общем-то да, дествительно, отношение больше чем в 2 раза.
14 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится
Интересно, кто нибудь кроме меня такой изврат писал в D? Создадим 5 декартовых деревьев, в каждом храним числа с заданным остатком по модулю 5. При добавлении и удалении разделяем их на 10 половинок по ключу, затем склеиваем со сдвигом, т.к. правая часть чисел с остатком 2 теперь имеют остаток 3 или 1.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

    +2, Потрясающе :)
    КО: достаточно одно дерево, просто в качестве груза хранить 5 сумм :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я знаю, я читал разборы выше. Мне просто понравилось писать 5 декартовых деревьев :).
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        я коммент чуток поменял
      • 14 лет назад, # ^ |
          Проголосовать: нравится -13 Проголосовать: не нравится
        Надеюсь, не Ctrl+C/Ctrl+V?
        Я обычно пишу один класс/шаблон, а потом создаю, сколько хочу.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Нет, у меня есть структура "вершина", и в операциях split и merge я работаю с указателями на такие структуры. Так что все по одному разу.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я писал. Мне это показалось проще, чем хранить в дереве сумму по всем остаткам. Сразу заработало и сдалось. Да и кода не особо много - функция rotate(x), которая производит циклический сдвиг хвостиков, занимает две строчки.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      В декартовом дереве легко делаются такие операции, вся логика в одной функции апдейта вершины.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я понимаю, как это делать :)
        Просто на контесте мне вспомнилась задачка с каких-то сборов. Там делалась очень кривая групповая операция на отрезке (если не ошибаюсь, возведение в степень по модулю, причем числа давались в условии) и требовалось получать сумму на отрезке. Оказывалось, что период операции совсем небольшой, и задача в том числе решалась таким же способом несколькими декартовыми деревьями. Насчет этого я был уверен, что напишу, потому что уже реализовывал раньше. А с хранением кучи сумм в одном дереве я побоялся запутаться. Хотя, не спорю, это может быть и проще.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    Такое же решение. Сдал за 3 секунды до конца.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я тоже так писал.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    И я так же написал.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Кстати, только у меня на главной отображается, что количество комментов - 58?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Очень обидно что из за олимпиады в физтехе из за которой не было возможности зарегестрироваться с 7 до 19 на тур не было возможности поучатсвовать в раунде отбора
14 лет назад, # |
  Проголосовать: нравится -12 Проголосовать: не нравится
Increase the number of programmers qualifying for the second round if u can 200 seems too less.... :-|
14 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится
Писать завтра второй раунд в комнате для неудачников или не писать? :-X
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На самом деле я тоже чудом проскочил, странные задачи были, рандом некоторый есть, так что не неудачники там будут. А те кому просто just for fun хочется порешать вечером воскресенья, вместо тысячи более глупых занатий, они выберут контест в своё удовольствие. А во вторых если там по твоему там будут лузеры, так ты только в рейтинге подрастешь, чем плохо?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Так вот у меня просто как-то другие занятия just for fun намечаются на вечер воскресенья, выбирай - не хочу. А по рейтингу вроде как контест ничем не лучше и не хуже другого.
14 лет назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

Why there are passed O(N^2 log N) solutions in problem D's status? Like this one with id 464685:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

#define long long long

#ifdef DEBUG
#define WATCH(x) (cerr << #x << '=' << (x) << endl)
#define TRACE(x) (cerr << (x) << endl)
#else
#define WATCH(x) /*()*/
#define TRACE(x) /*()*/
#endif

vector<int> v;
int n;
int main() {
    cin >> n;
    v.reserve(n);
    for(int i = 0; i < n; ++i) {
        string s; cin >> s;
        if (s == "sum") {
            int l = v.size();
            long sum = 0;
            for(int i = 2; i < l; i += 5) {
                sum += v[i];
            }
            cout << sum << endl;
        } else {
            int x; cin >> x;
            if (s == "add") {              
                v.insert(lower_bound(v.begin(), v.end(), x), x);
            } else { // s == "del"
                v.erase(lower_bound(v.begin(), v.end(), x));
            }
        }
    }
}

  • 14 лет назад, # ^ |
      Проголосовать: нравится +7 Проголосовать: не нравится
    It's not N2logn, but N2. And it have very small constant, so it passed.

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

      The use of lower_bound function makes the del and add N log N so totally N^2 log N. Am I wrong?
      EDIT: Hehe!! Of course I'm wrong!! Sorry :D
  • 14 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    why it's O(N^2 log N)? I think it's just O(N^2) 
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

    Because all the test cases are sorted or just random numbers
    I am sure this solution will fail if a test case like this one exists

    100000
    add 100000
    add 99999
    .
    .
    .
    add 2
    add 1

    Too bad there are no hacks during practice!
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Agree with you. The testdata looks weak.
      This kind of problems should generate data with defferent monotonicity to beat various brute force approaches.
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится -7 Проголосовать: не нравится

      It will work ~2 times slowlier. But TL is 4 seconds, so that this solution could pass.
      • 14 лет назад, # ^ |
          Проголосовать: нравится -8 Проголосовать: не нравится
        This is so weird! I am very curious to know what is happening!

        "A vector is a Sequence that supports random access to elements, constant time insertion and removal of elements at the end, and linear time insertion and removal of elements at the beginning or in the middle."
        source: http://www.sgi.com/tech/stl/Vector.html

        Do you have an explanation?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        I've tested this solution on such case, it works for ~3 seconds. However, I was surprised that there is no similar case in official tests.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится
    #define long long long
    :D
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Не туда.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I found a small bug on codeforces: top-rated on the top page looks a bit old. http://gyazo.com/9c850d39ab001b012816baaf52becd9a.png
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Does smb have problems with registration outside the Round 2?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересуюсь не из желания восстановить справедливость, а из чистого любопытства. В первом раунде у меня было 74 место и итоговый рейтинг получался 2126. Но это было вчера. А сегодня я вчера выступил на 75 место и итоговый рейтинг имею 2125. Что-то произошло с таблицей результатов?
»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

E was quite actually nice problem. Nice concept. Thanks for the round.