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

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

contests.snarknews.info: "..._В рамках проекта SnarkNews при поддержке компании "Яндекс" стартовала летняя серия индивидуальных соревнований по программированию SnarkNews Summer Series — 2012. Серия состоит из 5 раундов. При этом каждый раунд проходит по правилам TCM/Time. Участвовать в серии могут те, кто или уже зарегистрирован на сервере личных соревнований SnarkNews (список зарегистрированных доступен по ссылке "Пользователи" в верхнем меню), или подал заявку на участие в SNSS-2012 согласно правилам серии по адресу sn_register(собака)snarknews(точка)info._ Участвовать в SNSS-2012 можно, начиная с любого раунда..."

Расписание

Окончание первого раунда

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

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

Кто может помочь?Я отослал письмо с запросом регистрации, но уже нет ответа 3 дня.

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

Я вошел в систему, но растерялся. Здесь и счетчик в котором 20 мин осталось и написано не начался и везде написано виртуальный контест и длительность 80 мин. А на календаре аропана написано что длительность еще 7 дней. Что происходит? Подскажите!

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

    Такие правила проведение — ты можешь в любой момент начать решать до окончания раунда, но решать будешь только 80 минут.

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

      а что значит вот это:"00:33:36 / НЕ НАЧАЛСЯ" в зеленой полосочке?

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

    Правила не читай
    @
    Контест начинай

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

А куда пропал таймер у людей, которые в данный момент пишут раунд, на страничке Standings?

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

Было бы неплохо открыть дорешку или какой-нибудь еще контест, чтобы можно было проверить, что твой шаблон нормально компилируется и запускается на сервере. У меня внезапно возникли RE 1 на Java, причем решения с таким же шаблоном нормально заходят в дорешку Opencup. Видимо, из-за политики безопасности какие-то функции нельзя вызывать.

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

    Дорешивание есть в этом же контесте, сразу после окончания.

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

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

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

        А для чего там находится задача X? разве не для того,чтобы посылать туда ерунду и смотреть, как она работает?

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

          но обратно же, до начала соревнования не потестишь...

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

            Я выяснил, что происходит. На Java 6 нельзя создавать новый Thread — падает с Runtime Error. На Java 7 все работает.

            Кому интересно, вот код, который работает на Java 7 и вызывает Runtime Error на Java 6.

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

Надеюсь, что фраза "в одной задаче слабые тесты" подпадает под пункт правил "обсуждение неточностей или ошибок" не ведёт к дисквалификации". Если нет — поправьте.

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

    Ты о чем?

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

      О том, что по одной задаче заходит аж 2 неверных алгоритма, которые на нормальных тестах дают TL с приличным запасом. Не будем это обсуждать до конца раунда. Тесты я уже отправил судьям. Может это только я такой глупый :-)

      UPD: Хм... Раунд закончился, а ответа от судей или падения хотя бы своих решений я так и не увидел...

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        1. Раунд еще не закончился

        2. Есть правило, что на АСМ контестах ОК не пересуживается

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

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

        В задаче D действительно тесты были рандомными, и некоторые специально подобранные ручные тесты отсутствовали. Возможно, "в дорешивание" предложенные тесты и будут добавлены.

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

    Думаю это все же лучше во время соревнования донести до судей, а уже после окончания — общественности...

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

Раунд закончился. Как решать B ?

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

    Я построил Карася на 1 строке. переходы из конечного состояния в него же.

    Суем в корень 1, далее N раз из каждоый вершины переносим и 0, и 1.

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

      Карась легко строится при помощи КМП функции...

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

    Динамика fijt — количество слов длины i, максимальная длина префикса, который равен суффиксу ключа у этих слов равна j, и t false|true — содержат ли слова ключ как подстроку.

    Рекомендуемое знание алгоритмов КМП, Ахо-Карасик.

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

      Ещё одна динамика: fn — количество слов длины n, в которых ключ встречается только в конце, но не раньше. Если длина ключа m, то тогда fn равняется 2n - m (общее количество строк длины n, которые оканчиваются на ключ) минус количество строк длины n, которые содержат ключ так же и раньше. А это:

      1. fk * 2n - k - m, если k + m ≤ n (то есть, если первое вхождение ключа не перекрывается с последним);
      2. fk, если первое вхождение ключа перекрывается с последним (т.е., если суффикс равен префиксу ключа длины перекрытия).

      Ну а потом ответ считается как сумма всех di·2l - i, т.к. справа всё равно, какие биты стоят (l это нужная в задаче длина).

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

        красивое решение, а то с этими состояниями было не было как-то не приятно... спасибо

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

Только что отрешал. Кто-нибудь может подсказать что требовалось в D ? Я выводил ((n^k)-1)mod m, WA5

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

    (n^k-1)/(n-1) = 1 + n + n^2 + n^(k-1)

    Заметим, что

    1 + n^(2k-1) = (n^k+1)(1 + ... + n ^(k-1))

    Рекурсивно считаем как возведение в степень. Итого log^2

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

      Ну или матричку ((1,n),(0,n)) можно возвести

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

      Не совсем понятно, что и как рекурсивно считаем? Нам же надо посчитать (Nk - 1) / (N - 1) mod M. Я так понимаю, что можно посчитать Nk-1 mod M*(N-1) и поделить на N-1, но вычисления не помещаются в long long =(

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

        1 + n + n2 + ... + nk - 1

        Если k четное, то эта штука равна (1 + n + ... + nk / 2 - 1)(1 + nk / 2)

        Если k нечетное, то посчитаем 1 + n + n2 + ... + nk - 2 и прибавим nk - 1

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

        Имелся в виду другой подход. Воспользуемся представлением

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

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

      Можно и за log, если из 1 + ... + n2k - 1 выносить 1 + n.

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

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

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

      Или можно воспользоваться тем, что если a делится на b, то (a / b) % m = (a % (b * m)) / b, где в правой части деление не по модулю, а обычное, причем остатка не будет.

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

    Ты забыл поделить на N - 1, у меня такая же ошибка. Прочитай внимательно условие ;)

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

      Судя по монитору нас таких много ) в общем больше не буду сдавать в слепую, толку мне от этого маловато.

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

        Да, не мало, и тесты хорошо подобраны)... Толку не много, но просто надо вбить в себя правило "внимательно читать и писать"

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

      Присоединяюсь к клубу.

      И ведь искал в условии, сколько сотрудников. Но мысль, что в первых двух предложениях текста может быть часть условия, меня почему-то не посетила. В итоге остановился на понимании «в книге учёта будет одна запись на всех сотрудников». Что, конечно, противоречит условию («... для каждого из сотрудников компании»).

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

    Блин, я в задаче D забыл, что ограничения до 109, и отправил for от 0 до k-1... Epic Fail.

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

Как решается F? Динамика за O(сумма всех A[i]) для каждого теста дает тайм

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

    Пройти направо, обеспечивая h[i + 1] ≤ h[i] + 1; пройти налево, обеспечивая h[i - 1] ≤ h[i] + 1. Каждый раз уменьшаем высоту на как можно меньшее число. Легко доказать, что в результате двух проходов получится нужный результат, а в процессе мы не убирали лишних коробок.

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

      Можно поподробнее, почему это верно?

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

        Заметим, что мы никогда не убираем лишнего: если мы снимаем коробки сверху с i башни, значит, h[i] = h[i ± 1] + 1. Высота соседа со временем не увеличится, а значит, текущее значение h[i] также не меньше максимально возможного ответа. По индукции, мы никогда не теряем оптимальности.

        После первого прохода нам известно, что h[i - 1] ≥ h[i] - 1. Во время второго прохода h[i] может только уменьшиться, неравенство сохранится до момента обработки h[i - 1]. Далее возможны два случая:

        1) h[i] - 1 ≤ h[i - 1] ≤ h[i] + 1. Высоту h[i - 1] менять не будем.

        2) h[i - 1] > h[i] + 1. Тогда новая h[i - 1] = h[i] + 1 > h[i] - 1.

        Значит, неравенство h[i - 1] ≥ h[i] - 1 сохранится. В свою очередь, во время второго прохода установится и h[i - 1] ≤ h[i] + 1. Получили то, что нужно.

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

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

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

    Я в приоритетную очередь кидал столбики из ящиков и каждый раз вытаскивал самый маленький и забирал лишнее ящики у соседей

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

      Ох ты ж блин, с set-ом TL, с priority_queue OK! Авторам незачет, NlogN тут явно надо было отсекать.

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

        То же самое и с A.

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

          Кстати, на Java руками-написанная-куча заходит. PriorityQueue, конечно же, TL-ит.

          А еще там недотест, потому что вот это решение тоже получило AC. В нем, в отличие от решения по предыдущей ссылке, есть существенная бага.

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

            Странно, у меня на Java PriorityQueue с использованием объектов заходит.

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

              Кстати, это решение легко переделывается в линейное используя вместо приоритетной очереди n списков и сразу отсекая кучи у которых больше n ящиков

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

    У меня немного укуренное решение. Посортим массив подсчетом, будем хранить в ids[x] номера элементов, значение которых равно x. Теперь бежим по этим элементам, начиная с меньших значений. Когда мы рассматриваем элемент с номером i, равный x, надо элементы с номерами i-1 и i+1, если они были больше, уменьшить до величины x+1 и засунуть в ids[x+1]. Получается, что элементы могут находиться в нескольких ids-ах, поэтому надо проверять их корректность условием вида if (a[i] == x), это чем-то похоже на пропуск некорректных элементов в Дейкстре с priority_queue.

    Это решение, однако, явно использует, что a[i] <= 100, если бы этого ограничения не было, то же самое приходилось бы делать set<pair<int,int>>-ом за NlogN, что у меня поначалу не зашло. Так что оно нехорошее:)

    P.S. priority_queue таки заходит, см. коммент выше. Пичалька.

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

    Я делал так: идём слева направо, уменьшая по надобности высоты блоков. Если пришлось уменьшить высоту из-за того, что блок справа слишком низкий, то возвращаемся к предыдущему блоку и продолжаем процесс. Опирался на тот факт, что высота каждого столбика не больше 100, на каждом шаге назад мы уменьшали высоту какого-то блока, а 10^7 — это не очень много =) Да и вообще, мы не сможем сделать более 100 шагов назад подряд, так что прошло без проблем.

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

Краткий разбор Е:

Как известно, кратчайшие пути из конкретной вершины в графе без отрицательных циклов образуют ориентированный ациклический граф. Нам нужно найти наиболее удаленную от офиса вершину, такую, чтобы из нее были достижимы дома обоих программистов. Решение: Дейкстра (построение графа кратчайших путей из офиса) + ДФС из домов обоих программистов по обратным ребрам графа, построенного на предыдущем шаге (определение достижимости).

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

    Можно просто запустить три дейкстры: из офиса и из каждого дома. Потом переберем все вершины v. Эта вершина может быть в пути, если растояние от офиса до v + v до i-того дома = расстоянию от офиса до i-того дома. Ответом будет минимум расстояний от офиса до вершины v по всем вершинам, которе могут быть на пути.

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

А задача C должна решаться обычным перебором или там что-то хитрее должно быть?

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

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