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

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

5 августа 2016 в 22:00 (время московское) открылся первый этап SnarkNews Summer Series 2018. Как и несколько предыдущих серий, SNSS-2018 пройдёт на системе Яндекс.Контест. Опубликовано расписание серии.

По просьбам участников отдельно публикую ссылку для регистрации и входа в первый раунд. В комментариях к этому сообщению по окончании раунда в соответствии с расписанием можно будет обсудить задачи первого раунда. Напоминаю, что первый раунд заканчивается в 22:00 московского времени 14 августа.

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

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

5 августа 2016 в 22:00

Можно год поменять на 2018, а так задачи интересные!

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

Как решается задачи C и A ? Вроде простые задачи ,но решить не смог .

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

Должно ли в задаче D проходить решение за квадрат? То есть, получаем строки из поддеревьев в явном виде и сравниваем их. Мое проходит с временем 0.945 и памятью 37 МБ. Возможно, кто-нибудь сумеет подобрать контр-тест, который приводит к TLE или ML. Исходный код.

UPD: Возможно, это не квадрат, а O(n log(n)), так как чтобы произошло сравнение длинных строк, необходимо, чтобы у текущего узла было как минимум два поддерева одинаковой высоты максимальной высоты

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

    Это O(n). После каждого сравнение двух строк одинаковой максимальной длины мы оставляем лучшую, а про вторую забываем. Забытой строке соответствует какой-то путь в дереве, и вершины с этого пути больше рассматриваться не будет. А так как всего у нас n вершин, то мы не можем забыть более чем n вершин, и все сравнения работают суммарно за O(n).

    Вот только ваша реализация работает конечно же за квадрат из-за того, что строка явно возвращается:

    auto temp = cost[v] + visit(v, u);
    
  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

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

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

    Большое спасибо, MrDindows, Gassa. Вообще я написал это решение только чтобы найти багу в решении с хешами, в итоге и линейное решение получил (осталось std::string поменять на std::list<char>), и багу с хешам исправил. Прикреплю заодно решение с хешами по модулю 261 - 1, может кому пригодится. Исходный код