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

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

Всем привет.

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

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

UPD2. Размечтался. Вносите результаты в Google форму

UPD4. Какое-то время действовал скрипт. Но к сожалению, вандалы не дремлют. Пришлось откатиться на формы+ручная копипаста

UPD5. (Автор поста уже не спит :) ). Добавлены все данные по регионам, где проводилось в Я.Контесте.

UPD6. В таблице небольшие проблемы со вторым туром. Мы работаем над проблемой и пытаемся восстановить таблицу и результаты.

UPD7. Пожалуй лучшее, что сейчас можно сделать — забыть про результаты с первого тура и заново составить таблицу уже с результатами обоих туров. Когда таблица примет более-менее адекватный вид, проверьте свой результат и напишите, если что-то не так. Извиняемся за неудобства.

UPD8. Таблица вновь работает. Добавил в пост ссылки на задания и тесты и на контесты в тренировках Codeforces.

UPD9. Теперь можно дорешивать на informatics. Добавил ссылку вниз.


Результаты

# by AlexKolc: Задания и тесты

Появилось на informatics: 1, 2 тур.

На Codeforces в тренировках: 1, 2 тур

Обсуждение задачи: A B C D | E F G H

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

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +38 Проголосовать: не нравится
»
11 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Кто-нибудь решил третью без декартового дерева?

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

    Это ту задачу, в которой прямо написано: "Ребята, напишите декартку по неявному ключу. Даже не заморачивайтесь, ничего экстра сложного."?

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

    Я. Там корневуха.

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

    Проходит (на 100) корневая оптимизация: разбиваем массив примерно на кусков, каждый запрос обрабатываем, меняя кусок, в котором находится наша вершина (поддерживая сумму квадратов), как будто других кусков нет. Каждые примерно операции перестраиваем структкуру, чтобы избежать слишком различных размеров кусков и порчи асимптотики. Итого .

    Но на самом деле там, по всей видимости, слабые тесты (заходило на 100 баллов без перестройки (sic!)).

    P. S. Результаты большей части участников из СПб можно найти на neerc.ifmo.ru/school

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

    Там есть простенькое дерево отрезков.

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

      А как её с ДО на 100 сдать? У меня только на 80 получилось...

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

        Подозреваю, что никак. ДО там как вариант для решения 3ей подзадачи.

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

          А как 3 с ДО решать?

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

            У вас есть список предприятий, который только сокращяется. Строим ДО, с помощью которого будем искать в нём элемент с заданным номером, что аналогично поиску префикса массива с заданной суммой (сумма и есть номер элемента)

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

            Заведём массив, в котором будем хранить длины у оставшихся предприятий. Также заведём ещё фиктивный массив, который будет показывать, осталось предприятие или нет(1 если осталось. На нём мы потом будем строить ДО по сумме). И ещё один массив, в котором будем хранить указатели на следующую и предыдущую не обанкротившуюся кампанию. Во втором массиве изначально все 1.

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

            Теперь. Как с помощью ДО найти V-ую вершину? Пусть мы находимся в вершине ДО. Мы знаем, сколько ещё не убитых предприятий в левом и правом сыне. Тогда если в левом их больше, чем V, то V лежит где-то в правом сыне, и мы переходим к правому сыну, попутно вычитая из V количество предприятий в левом. Иначе идём в левого. Как только мы дошли до листа, то этот лист и является искомой вершиной.

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

      Идея решения с деревом отрезков такая:

      Можно хранить информацию о соответствующих предприятиях в индексах 1, 1 + a1, 1 + a1 + a2, ..., 1 + a1 + a2 + ... + an.

      Написашем дерево отрезков для поиска kой единицы и присвоением элементе с индексом i. Дерево отрезков при таком запросе затрагивает O(log(sum)) вершин. Поэтому нужно хранить те вершины, которые будут посещены.

      Код

      Но кода в этом решении примерно столько же, сколько в решении с декартовым деревом, да и использует оно O((n + k) * log(sum)) памяти.

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

    Решение с order_statistics_tree. Учитывая то, какая нам нужна функциональность, можно легко заменить его на сжатое дерево отрезков.

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

У нас в регионе принудительно забрали все условия. У всех так же?

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

Мне одному показалось, что первая сложнее второй?

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

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

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

      Да, но обычно первая пишется с прочтения, а не вторая (да и третья). А у меня наоборот получилось.
      Хотя мб проблема в том, что я долго не мог осознать, что периметр — удвоенная сумма сторон...

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

    Боль. Первая 100. Вторая 0. Третья 100. Четвертая 27.

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

"Я Станкевич, я придумал весь контест..."

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

Знал, что плохо/никак пишу Декартово дерево. Вчера наткнулся на пост о нем, подумал "может повторить?", но решил, что его же все равно не будет, потом повторю. Аукнулось :<

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

Если тут есть те, кто работали с Яндекс.Контестом — как всё прошло? Были ли очереди тестирования?

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

    .

    • »
      »
      »
      11 лет назад, скрыть # ^ |
      Rev. 33  
      Проголосовать: нравится +47 Проголосовать: не нравится

      Возможно, я могу приоткрыть немного инсайдерской информации о том, как у нас в регионе это проходило и вполне могло бы проходить в любом другом регионе, у которого олимпиада проводится на чём то не особо крутом и поддерживаемом и при этом ЦМК меняет правила проведения.

      Прелюдия.

      Где то в декабре нам абсолютно случайно попадает информация о том, что в этом году в олимпиаде меняется два достаточно существенных правила — проверка заданий во время тура и проверка подзадач по правилам балл только за группу тестов. Наша старушка-система конечно же не была в состоянии проводить мероприятие согласно этим правилам по двум причинам. Первое — ввиду обязательности проверки во время контеста на достаточно большом количестве тестов и при этом отсутствие в явном виде в системе возможности параллельной работы сразу нескольких воркеров(чекеров) на удалённых машинах мы обеспокоились пропускной способностью системы. 4 задачи * минимум 10 попыток * 20 участников * 1 минуту в худшем случае на проверку 1 человека. Итого 800 машино/минут надо было бы выдать за 5 часов. А чекер то всего один и, как подсказывает математика, его производительность за 5 часов слегка меньше. Второе — новые правила проверки, выдача отчётов. Требуется переписывать и веб часть и сам чекер для удалённой машины. В общем, очень старая система на perl с файликами в качестве БД и очереди проверки. Допиливать её без опыта работы с perlом и без написания тестов на новый функционал — удовольствие ниже среднего.

      Общий центр проверки.

      Но слава богу, ЦМК обещал предоставить для регионов общий центр проверки решений на базе Я.Контеста. Казалось бы, записывайся на работу с ним и проблем нет. Но тут начинаются бюрократические трения об местных организаторов, которые не особо хотят нам выдать документ со всеми подписями и печатями, предоставляющий нашему председателю жюри права координатора. Они решают это обсудить. В этот момент мои нервы не выдерживают и я на всякий случай начинаю писать новую версию проверяющей системы. Времени то было ещё достаточно. В конечном итоге, перед самым НГ нам вроде как дают добро и мы получаем возможность официально работать с Я.Контестом. В результате, мы решаем использовать Я.Контест как основной вариант, как запасной вариант я продолжаю писать свою. Проходят новогодние каникулы. По своим убеждениям на eJudge мы посматриваем с опаской (и, видимо, не зря) — слишком много "ручек" и нюансов его работы.

      О, Оу.

      На первой неделе после выходных дней мы отсылаем заявку в Я.Контест и начинаем ждать ответа. Ответа не приходит до 16 января. Мои нервы не выдерживают опять и я пишу в личку VK представителю проверяющего центра с просьбой хоть как то обработать нашу заявку. Вечером этого дня нам отвечают. Наш координатор получает письмо с инструкциями, мы радостно тестим пробный тур, пишем пару сообщений жюри через интерфейс (не ляжет ли веб морда и какова оценка по длине очереди проверки, если много регионов решат переложить проверку на Я.Контест; смогут ли жюри смотреть сабмиты своих подопечных и сами потыкать систему до и во время туров) и на эти сообщения вообще почти не отвечают. Пятая точка начинает пригорать от такого расклада перед самой олимпиадой и в авральном режиме начинается поиск запасного варианта. Я уже выхожу на работу и не успеваю дописать свою, председатель жюри каким то чудом допиливает старую систему на перле под новую проверку буквально за пару дней до мероприятия, для добавления ещё одного воркера просто разводим участников на два разных сайта. Параллельно с этим как обычно мы ещё должны подготовить рабочие места, прорешать задачи и т.п. В общем, экшена выше крыши.

      Итог.

      Так как Я.Контест продолжает игнорить наши вопросы и пароли к нам приходят чуть ли не в день пробного тура, мы, офигевшие от такого уровня сервиса, решаем отказаться от использования Я.Контеста и проводим олимпиаду на том, что было. Все проходит нормально. В результате участники получают практически отсутствие очередей проверки при полном соблюдении правил олимпиады. Разбор пишется мною наперегонки с участниками уже прямо во время тура. Вот такой miracle :-).

      Боюсь представить, что могло бы произойти в регионе в аналогичных условиях, если бы там вообще могло не оказаться людей, которые могли бы подпилить свою legacy систему или не было бы на это времени. UPD: А вот и пример.

      PS: Извините за много эмоций, но это была самая нервотрёпная областная олимпиада за 5 лет моего участия в её орг. комитете.

      UPD:Если кому интересно — разбор задач II тура: 1-3 задачи, 4-ая задача

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

        4 задачи * минимум 10 попыток * 20 участников * 1 минуту в худшем случае на проверку 1 человека.

        Это явно завышенная оценка, предполагающая, что каждый из участников будет решать решать каждую задачу и сдаст по ней 10 решений.

        На самом деле у нас, например, в среднем было 12 сабмитов от одного участника за время тура. Итого при 12 участниках получаем — 12 * 20 = 240 минут на тестирование, при времени тура в 300 минут. Конечно, это всё распределено неравномерно, но и время тестирования в 1 минуту на сабмит завышено, там не во всех задачах будет по 50 тестов.

        По моей оценке один инвокер должен справляться примерно с 50 участниками, при 20 участниках дополнительные инвокеры не нужны.

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

          Да, на практике оказалось, что участники отправили примерно в 4 раза меньше решений. Ну и мы вежливо попросили не абузить систему:-). Но если что — мы должны были быть готовы и к более активной сдаче задач и отдаче отчётов с приемлемым ожиданием для участников (у нас пару раз всего решения тестировались параллельно на обоих машинах). И задач, где обход TL является основной проблемой (хэши, перебор), могло быть больше и тогда бы они могли бы очень упорно с минимальными модификациями пытаться протолкнуть решение. В конце концов, они не должны страдать от того, что им дали права на полную проверку во время тура.

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

        Мне очень жаль, что вам показалось что я вас игнорирую. Я наверняка переоценила свою способность оперативно отвечать быстрее чем за 4 дня (с 12 по 16 января) на письма от двадцати человек и я прошу прощения, что это принесло вам столько неудобств.

        В действительности, как я рекомендовала в информационном письме, задавать вопросы о системе используя интерфейс вопроса в жюри на пробном туре не было лучшим способом получить информацию о платформе :) .

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

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

          Ну мы же взрослые люди. Не всегда эмоциям нужно иметь место в официальных письмах. Да и когда писалось это письмо мы уже чуток поостыли.

          Мы честно надеялись, что ЦМК отдаёт себе отчёт в тех процедурах, которые предлагает использовать. Что мероприятие такого уровня в Яндексе не будет организовано так, как оно было организовано, платформа будет заранее подпилена под нужды соревнования в том числе для жюри и будет учтена повышенная нервозность региональных жюри, когда они впервые вынуждены отдать техническую сторону мероприятия в аутсорс.

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

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

Кто-нибудь еще использовал принцип включений-исключений в первой задаче? )))

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

Я думаю, все и так ожидали, что задачи усложнятся. Как думаете, после 180 есть какой-нибудь шанс?

»
11 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится +3 Проголосовать: не нравится

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

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

Кто как решал четвертую?

  • »
    »
    11 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится +3 Проголосовать: не нравится
    1. Построим алфавит.
    2. Построим бор для фильтров и для *фильтров.
    3. Для каждого адреса перебираем какой от начала кусок отрезать.
    4. Ходим по бору.
  • »
    »
    11 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +12 Проголосовать: не нравится

    Базовая идея в том, что фиксированному адресу соответствует небольшое количество шаблонов, поэтому прежде всего следует перебрать сам шаблон (перебирается то, сколько остается слева и сколько — справа).

    Дальше задача сводится к получению количества вхождений строки в словарь (хэши или бор).

    Без хаков такое не проходит все тесты, поэтому я сделал следующее: для начала сложил все шаблоны в бор (с map, конечно), подсчитав количество вхождений в вершинах; затем для очередного шаблона я перебираю только "левый" шаблон, а затем иду по бору этой строкой, при этом, проходя по символу '/', я дополнительно добавляю к ответу вершину, достижимую из текущей по ребру с символом '*', покрывая таким образом все "правые" шаблоны, соответствующие фиксированному левому.

    Упорно ML'илось на VC++, но как-то зашло на G++11 =)

    Говорят, заходило решение и с хэшами, но вместо map использовали массив и бинпоиск.

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

    Забавно, но очевидное решение на Java c HashMap проходит по времени без дополнительных приседаний.

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

      На C# аналогичная ситуация с Dictionary. Признаться говоря эта задача мне показалась слишком легкой, да и зашла она с первой попытки.

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

    (Третья группа, но оставшиеся тоже должно проходить): запомним хэши (по модулю 264, длина строк позволяет считать по этому модулю безбоязненно) всех фильтров и отсортируем массив (пусть это v).

    Для каждой строки-адреса отметим все её подстроки, являющиеся правильными адресами (их не более 25, так как всего не более 5 частей в имени сервера и в имени сегмента). Тогда понятно, что добавив (или нет) *. в начале и /* в конце мы получим фильтры, подходящие по данную строку. Легко понять, что все подходящие фильтры получаются таким образом, а всего к одной строке подходят не более 25 + 5 + 5 + 1 = 36 фильтров.

    Посчитаем хэши всех этих фильтров и просуммируем количество вхождений конкретных хэшей в v. Это число и есть ответ для данного адреса.

    "Асимптотика" (раньше вместо 42 было 36). Получает 96 баллов. Чтобы получить 100 баллов нужно было отдельно хранить хэши для четырёх типов исходных фильтров (в зависимости от содержания/отсутствия "*." и "/*") и избегать чрезмерного копирования памяти.

    P. S. Как меня правильно поправили, фильтров 5·6 + 5 + 6 + 1 = 42, так как имя раздела может быть пустым.

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

UPD5. (Автор поста спит). Добавлены все данные по регионам, где проводилось в Я.Контесте.

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

Товарищи, а правда, что на регионе не должно быть справки по языку?

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

    По идее должны быть.

    P.S. В Москве на компах у всех была папка с Корманом и Седжвиком. На вопрос организаторам в честь чего такая радость, всех заставили удалить))

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

      Вчера на туре писал на C++ (Visual Studio 2008), возникла проблема с возвращаемым значением какой-то функции. Захожу в справку — ничего нет. Попросил помощи у организаторов. Ответ был примерно такой: "Вы идёте на олимпиаду по информатике и должны знать язык. К справке по языкам доступа нет". Есть ли в положении о проведении момент, что справка по языку должна быть? Или это на усмотрение организаторов?

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

      В Москве — это где? В 1С не вроде не было, либо было, но [почти] никто об этом не знал. На сайте olympiads.ru висит некоторая документация, но она не очень удобная (жаль, нет зеркала cplusplus.com/reference/). А еще там доки по питону 3.4, а тестилка поддерживает только 3.2, я даже внезапно обломался на этом (чуть другие регэкспы).

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

Разберите B пожалуйста

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

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

    Пусть мы удалили отрезок [L,R]. Тогда второй получит приз в размере max(pref[L-1],suff[R+1]). Переберем все возможные удаляемые отрезки и найдём минимум этой величины.

    Массивы pref и suff строятся за O(N) (типа частичных сумм) Возможных отрезков тоже O(N). Обновление ответа за О(1). Итого О(N).

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +33 Проголосовать: не нравится

хехе, а у нас не было проверки на конечных тестах. Kemerovo region forever :C

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

А почему мой результат не захотели внести? Я конечно понимаю, что он несколько странный получился (60-100-100-100), но все же.

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

Давайте побеседуем о задаче номер восемь.

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

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

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

    В каждой компоненте сильной связности есть гамильтонов цикл, который можно найти за O(n2), компоненты образуют цепочку... Дальше рассказывать?)

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

      Рассказывай:)

      Как находить гамильтонов цикл?

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

        Инкрементально.

        Давай сперва за куб. Есть цикл длины k, как его увеличить? Можно попробовать какую-нибудь вершину вставить в середину. Если никого нельзя вставить, вершины разбились на два класса -- входящие и исходящие, между этими классами есть ребро в нужную сторону (потому что сильная связность).

        UPD: Просят подробнее. Если из вершины v есть ребро в цикл, а из цикла есть ребро в v, то v можно вставить в цикл. Если таких v нет, то для каждой вершины x или все рёбра из x в цикл (тип A), или все рёбра из цикла в x (тип B). Из B есть ребро в A (хотя бы одно, иначе граф не сильносвязный), найдём его, перебрав все рёбра, и удлиним таким образом цикл на две вершины.

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

          Круто, ну а как это делать за квадрат я уже понял:)

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

          Насколько это известный алгоритм? Я его не знал и выдумал на туре.

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

            Алгоритм за куб достаточно известен; он обычно используется в доказательстве наличия гамильтонова цикла в сильно связном полном орграфе классе так в 7-8 на математическом кружке; наличие цепочки из всех вершин в полном орграфе ещё более известное утверждение.

            О наличии алгоритма за квадрат слышу впервые.

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

            Хорош ;-)

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

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

              А можно пояснить, что дальше, когда мы уже нашли гамильтонов цикл? На туре я понял, что нужно копать в его сторону, но ни как его найти за квадрат, ни что делать дальше я не придумал. Просто даже если мы его нашли, у нас n интересующих нас рёбер, каждой проверяется за O(n^2), и того куб, как получить квадрат?

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

                От каждой вершины v цикла есть ребро в v+1 и ребро "максимально назад по циклу" back[v]. min[l,r] -- минимум back[i] на отрезке [l,r]. Теперь наращиваем компоненту: while min[l, r] < l: l = min[l, r] Получается проверка каждого ребра за линию.

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

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

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

      Да. Просто сразу очевидно, что в любом полном ориентированном графе есть цепочка. И её тоже можно найти за квадрат. А вот что с ней делать — непонятно.

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

    Как обрабатывать первую компоненту сильной связности:

    Изначально предположим, что ни одно ребро не меняет кол-во совершенных вершин.
    Делаем ans[k] += cnt[0] * (cnt[0] - 1) / 2;

    Теперь берем каждую вершину, у которой ровно одно входящее ребро. Если мы его развернем, то она единственная останется совершенной, поэтому делаем ans[k--], ans[1]++;

    Берем все вершины, у которых ровно одно исходящее ребро. Если мы его развернем, то она перестанет быть совершенной (а все остальные еще будут), делаем ans[k--], ans[k - 1]++;

    Но одно и то же ребро может быть посчитано два раза, тогда, очевидно, в силе первый вариант, делаем ans[k - 1]--, ans[k]++;

    В чем проблема?
    А в том, что это заходит.

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

      Если обновят тесты, думаю, будет по -30 пачке людей...

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

      Эм... На 100ку?

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

      Ломается (вроде бы) на

      10 1
      .++--++++-
      -.++-+++++
      --.+++++++
      +--.++++++
      ++--.+++++
      -----.++--
      ------.++-
      -------.++
      -----+--.+
      +----++--.
      

      Выдаёт

      10
      0 0 0 0 0 0 0 0 0 45  
      
    • »
      »
      »
      11 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +8 Проголосовать: не нравится

      Жюри собираются что-нибудь с этим делать?

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

        В любом случае, это не сильно что-либо поменяет. Снизятся баллы у пары-тройки людей максимум, причем вряд ли это повлияет на их проход на финал и на призерство на регионе (если оно вообще сильно важно). Лично мне важны были по большей части только качественные результаты (то, как я порешал), а наличие/отсутствие 30 баллов за решение, посланное из-за отсутствия нормальных идей в последние 5 минут контеста, погоды не сделает.

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

        Никогда не поверю, что жюри хотя бы одного региона снимет баллы по задаче после контеста.

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

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

        Поскольку функционал жюри — проверка решений по утвержденной методике, то есть по предоставленным тестам. Выяснение того, насколько эти тесты качественно подготовлены, подготовка новых тестов в функционал жюри регионального этапа не входит. Более того, у жюри нет полномочий оценивать решения участников как-либо иначе, кроме как посредством предоставленных тестов.

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

    По восьмой задаче вроде есть ещё такое решение.

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

    Обозначим за k размер первой компоненты сильной связности.

    Посмотрим на вершину v в этой компоненте. Поймём, какой будет ответ для ребёр, входящих в данную вершину. Рассмотрим множество вершин S, из которых идут ребра в нашу. Посмотрим на вершину u из множества S. Заметим, что если из неё идёт ребро в какую-то другую вершину w множества S, то ответ для ребра (u, v) равен k, т.к. из вершины v достижимы все вершины, в вершину u можно дойти из всех вершин, а из u в v есть путь (u – w – v). Значит единственная вершина, для ребра из которой мог поменяться ответ это вершина-сток множества S.

    Мы можем найти эту вершину за O(N2 / 32) с помощью bitset-а. Для каждой вершины будем изначально хранить bitset вершин, из которых в эту вершину есть ребро. При обработке вершины v запишем в bitset множество S и для каждой вершины из S про-and-им ее bitset смежности с bitset-ом множества S. Если для какой-то вершины таким образом мы получим снова множество S, то это и есть искомая вершина t. Эта часть работает за O(N3 / 32) суммарно для всех вершин.

    Теперь нам надо определить количество достижимых из v по обратным ребрам (т.к. по прямым из v мы можем дойти до любой вершины компоненты), запретив ходить по ребру (t, v). Для этого запустим из вершины v dfs, который будет хранить bitset вершин, на данный момент не достижимых из v. Изначально там все вершины компоненты кроме v. Далее при обрабатывании в dfs-е вершины u мы and-им её bitset смежности по обратным ребрам с bitset-ом недостижимых вершин и, если получившийся bitset ненулевой, запускаем dfs от всех ненулевых битов, не забывая удялять их из bitset-а недостижимых вершин. Ненулевой бит мы умеем искать за O(N / 32), изначально для каждой вершины недостижимых вершин не более N, так что асимптотика этой части и всего решения O(N3 / 32).

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

Все третью динамикой по профилю делали?

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

Какие прогнозы на проходные баллы? Если брать такое же кол-во 9-10-11 классов, как в прошлом году, то для 9 классов есть вероятность, что порог задвинут ниже 400

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

В таблице "популярна" ошибочная замена 100 100 100 70 на 100 100 70 0 во второй день, например у Богомолова, Куликова, Лобанова и Макарова.

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

Ветка обсуждения пятой задачи.

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

Ветка обсуждения шестой задачи.

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

    Как же у меня сгорело на туре от порядка инпута в ней. Писать решение 7 минут, чтобы потом искать несуществующую багу в длинке с полчаса.

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

      А зачем там длинка? Если нужно большое число сравнить с влезающим в long long, то можно его сперва сравнить с 4e18 (или другой подходящей константой) в long double.

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

        Ну, у меня логика была такая: "Так, тут бинпоиск. Ой, переполнение. Заслал на сервер, посмотрел, есть ли int_128, не оказалось, прикинул, что чем что-то выдумывать проще написать длинку"

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

          Можно было попробовать unsigned long long и написать аккуратно условия в бинпоиске (сначала сравнить, поделив, а потом уже обычное условие).

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

        А ещё можно воспользоваться делением. Можно ведь поделить и прибавить 1. И сравнить со вторым множителем.

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

        Там даже аккуратный unsigned long long. заходил

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

          У меня на яве обычный long зашел. Но мое первое решение крашнулось тестах на шести, долго думал, что из-за того, что как раз не влезает. Оказалось, что double просто точности не хватает при делении, которое использовал для нахождения кол-ва дней, переписал все на long и зашло.

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

        Там можно обойтись обычными long long int, если в качестве правой границы бинпоиска взять число, скажем, X/((A+B+1)/2)+2000 (вместо двух тысяч подходила, скорее всего, любая константа такого порядка). При этом переполнения не возникало

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

      Можно было посчитать в long double, затем перевести в long long

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

      Меня заминусуют, но я не знаю, зачем надо было придумывать что-то ещё, если можно было мгновенно написать решение в 7-14 строк на Java или на Python.

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

        Всё очень просто — для этого надо знать джаву или питон:)

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

        Не у всех на регионе есть джава или питон.

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

          Но они же вроде есть в требованиях, нет?

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

          Да тут у некоторых олимпиада вообще чёрти как проходит, а вы про питон... Так и вспоминаются золотые слова из материалов олимпиады: "В то же время, развитие в стране информационных систем проведения олимпиад по информатике с автоматической проверкой решений задач создало все условия для проведения регионального этапа во всех субъектах Российской Федерации на уровне заключительного этапа олимпиады по информатике и международной олимпиады по информатике..."

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

      Как-то сложно всё) В простом long long всё заходило.

      Там же по сути надо было проверить, что выражение ax + by >= val, где x, y, val <= 1e18 Тогда получаем, что если a > 1e18 / x или b > 1e18 / y, то значение выражения мы можем считать числом, которое заведомо больше val. Иначе это всё спокойно вмещалось в простой целочисленный тип данных.

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

    Забавная задача, не сразу зашла

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

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

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

    Избежать переполнения можно было так:

    typedef unsigned long long ull;
    
    int len( ull n ){
        int len = 0;
    
        while( n )
            n /= 10, len ++;
    
        return len;
    }
    
    bool check( ull mid ){
        ull ma = mid - mid / k;
        ull mb = mid - mid / m;
    
        if( len( a ) + len( ma ) >= len( x ) ) return true;
        if( len( b ) + len( mb ) >= len( x ) ) return true;
    
        ma *= a;
        mb *= b;
    
        return ( ma + mb >= x );
    }
    
    • »
      »
      »
      11 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Можно вместо умножения делать деление.
      Т.е если надо проверить a * x >= b, можно делать (a + x — 1) >= b / x.

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

Если вдруг надо

Регионы

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

Появились новые результаты регионов.