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

Автор snarknews, история, 7 лет назад, По-русски

2 января 2016 в 02:17 (время московское) открылся первый этап SnarkNews Winter Series 2017. Как и несколько предыдущих серий, SNWS-2017 пройдёт на системе Яндекс.Контест. Опубликовано расписание серии.

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

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

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

Что со вторым раундом? На сайте ссылка есть, но Яндекс пишет "У вас нет прав просматривать это соревнование".

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

tourist, ты в D писал корневую?

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

    Мне до tourist-а далеко, но я сдал в дорешку корень лог. Зашло за 3 секунды из 10 даже без подгона размера блока.

    Было обидно, дифф с решением с контеста -- четыре символа.

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

      Мне было интересно, нельзя ли придумать что-то за , мало ли.

      UPD: А лог под корнем или снаружи?

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

        Знаю, что zemen и Endagorion писали какие-то деревья отрезков, но никто из них в итоге не довёл до решения. Так что мне тоже интересно.

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

          Ну я тоже написал какое-то дерево отрезков, и тоже не довёл до ОКа — получил ТЛ на контесте.

          Давай хранить в каждой вершине мапу — сколько и каких чисел есть на данном отрезке. Поддерживаем инвариант, что в "некоторых" вершинах эта мапа корректна. Кроме мапы проталкиваем вниз число — на этом отрезке нужно сделать min= с числом x. Когда приходим в вершину, просто берем честно все числа, которые больше, чем x, и склеиваем их в x (суммарно вроде таких операций должно быть не очень много, т.к. либо одно число за лог, либо склеились два числа и ~ навсегда (нет, но чтобы их разъединить нужен будет еще запрос на более коротком отрезке)). Кроме того, когда приходит запрос "сделать новое min= на каком-то отрезке", разбиваем этот отрезков на вершины в дереве, в каждой из них все числа большие x склеиваем в x, и кроме того, в каждом из предков этой вершины повторяем те же самые действия. Таким образом, после обработки запроса корректны все мапы, в которых максимальное число не больше xv соответствующей вершины.

          Это похоже на какой-то log3, можно ускорить минимум на один логарифм если вместо мапы хранить отсортированные массивы со всеми числами, которые когда-либо появлялись на этом отрезке (их тоже не много, n log). На случайных тестах на 10^6 даже укладывается в десять секунд.

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

        Под корнем. Стандартная штука с блоками размером по корню, в каждом блоке отсортированный массив.

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

    Уведомления работают! :)

    Да, у меня .

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

Я написал в задаче B суффиксный массив и получил TL. Потом в дорешке добавил отсечение "брейкнуться, если количество классов эквивалентности уже равно n" и получил AC. Это какая-то особенность местных тестов? Или наоборот, известный хак? Потому что вроде бы на строке из всех одинаковых букв процесс построения должен был затянуться до максимума.

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

    Я всегда это отсечение пишу, ровно потому, что оно иногда спасает в случае не очень сильных тестов. Здесь, видимо, именно такая ситуация.

    А ты же знаешь, что эту задачу можно без суффструктур решать?

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

      Знаю, но на контесте не придумал.

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

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

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

        Почему худшим? Как раз если отсекаться, когда количество классов эквивалентности стало равно |S|, то на случайной строке ты почти сразу остановишься, потому как для сравнения любых двух суффиксов достаточно малого количества символов.

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

          Под стандартным я имел в виду e-maxxовский вариант, который без этого отсечения :-)

          Только что попробовал на задаче X случайную строку и строку из одинаковых букв, и оно все-таки на случайной работало немного медленнее даже с отсечением. А без него вообще 2.3 против 0.4.

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

Как решать C и F?

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

    C: если ответ существует, то среди любых трех точек хотя бы две лежат на одной прямой. Переберем пару из первых трех точек и для каждой такой пары проверим, можно ли построить ответ.

    А вообще на контесте у меня зашло решение "на любителя": пока не нашли ответ и не превысили некоторого порога времени (TL — 0.1 секунды), выбираем две случайные точки и проверяем, не нашли ли мы ответ. Нетрудно заметить, что если ответ есть, то он найдется довольно быстро :)

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

    В C есть забавное рандомизированное решение: выберем две случайные точки и предположим, что одна из прямых проходит через них. Тогда легко проверить, правда ли не попавшие на эту прямую точки лежат на некоторой другой прямой. Если решение существует, то вероятность успеха >= 1/2.

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

    F: ответ min(sumA / 2, sumA - maxA)

    Почему: рассмотрим тупое решение, на каждой итерации будем брать 2 самых популярных предмета, тогда в конце останется один вид, в количестве X >  = 0. В случае X = 0, 1 — ответ это sum / 2, в случае X > 1 это остаток от самой популярной кучки (причем ее изначальный размер больше половины от суммы), а значит все остальные предметы мы ставили с предметами из этой кучки, в таком случае ответ — sumA - maxA.

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

Третий раунд не работает, ситуация как была со вторым раундом "У вас нет прав просматривать это соревнование".