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

Автор InternetOlympiads, история, 14 месяцев назад, По-русски

Всем привет!

Мы открываем новый цикл интернет-олимпиад по программированию для школьников! Как всегда, интернет-олимпиады первой половины учебного года – командные, и позволяют потренироваться перед ВКОШП и другими официальными командными турнирами.

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

И первая командная интернет-олимпиада состоится уже завтра, 30 сентября 2023 года в 15:00 (по Московскому времени). Приглашаем всех принять в ней участие!

Продолжительность олимпиады – 5 часов, в течение которых вам будет предложено 12 задач – это чуть больше, чем обычно. Не забудьте зарегистрироваться на цикл командных интернет-олимпиад в этом сезоне перед началом олимпиады. Обратите внимание, что для участия в командных олимпиадах нужно зарегистрировать именно команду. Команда может содержать от 1 до 3 человек.

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

Условия появятся на сайте в момент начала олимпиады. Тестирующая система находится по адресу pcms.itmo.ru.

Олимпиаду для вас подготовили студенты университета ИТМО: Даниил Орешников (doreshnikov), Егор Юлин (EgorUlin), Даниил Голов (DanGolov), Константин Бац (kbats183), Александр Гордеев (gordeve) и Владислав Власов (Vladosiya).

Для связи с жюри можно использовать адрес электронной почты iojury@gmail.com.

Удачи!

UPD: олимпиада добавлена в тренировки на Codeforces. Разбор, надеемся, выложим завтра, где и обычно – на сайте в разделе "Материалы".

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

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

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

Но, надеемся, всем участникам будет интересно :) Тем временем остается полчаса до старта олимпиады – не забывайте регистрироваться, по возможности немного заранее.

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

Вопрос к организаторам: можно будет написать тренировку после ее окончания? Или только во время самого тура можно писать?

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

    Выложим сейчас в тренировки на codeforces :)

    Я правда забываю пополнять ссылки на тренировки в посте, но постараюсь в какой-то момент и его привести в актуальное состояние.

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

Автокомментарий: текст был обновлен пользователем InternetOlympiads (предыдущая версия, новая версия, сравнить).

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

Прочитал разбор. Хотел бы описать решение задачи I без 2-SAT. На мой взгляд, оно немного проще.

Пусть есть рёбра v->u и w->u. Если из двух рёбер, выходящих из v, возьмём v->u, то w->u мы точно не возьмём. Тогда мы возьмём ребро из вершины w в другую вершину (пусть это какая-то вершина t).

Продолжая данные рассуждения, сделав замену v := w, u := t, мы выделим два множества рёбер S1 и S2 такие, что если взято какое-то ребро из S1, то взяты все рёбра из S1 и ни одно ребро из S2 (и наоборот), причём для вершины v одно из рёбер, выходящих из неё, будет в S1, другое — в S2.

Запускаясь так от разных v, мы получим много пар множеств рёбер. Нам нужно из каждой пары множеств рёбер выбрать рёбра одного из них так, чтобы отрезки [a; b] выбранных рёбер пересекались. Как это сделать? Это несложная подзадача.

Пусть всего есть k пар множеств рёбер. Найдём для каждого множества рёбер пересечение всех рёбер этого множества. Пусть это [l, r]. Тогда добавим 1 на отрезке с l по r. Тогда нам нужно найти точку, в которую мы добавили 1 k раз, это и будет искомое значение w.

Надо заметить, что отрезки [l, r] для множеств из одной пары могут пересекаться. Тогда нужно дополнительно вычесть 1 на отрезке, соответствующем их пересечению.

Код

P. S. Можно убрать log из ассимптотики, заменив ДО на разностный массив для прибаления на отрезке за O(1), но и так заходит.