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

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

Приглашаем вас поучаствовать в турнире трех четвертьфиналов — командном онлайн-соревновании, которое будет проводиться параллельно с четвертьфиналами ACM в Москве, Минске и Санкт-Петербурге в конце октября. Турнир будет организован совместными усилиями команды Яндекс.Contest, Олега Христенко (snarknews) и жюри перечисленных четвертьфиналов ACM ICPC. Даты и времена проведения: Московский ЧФ (регистрация) — 21 октября, 14:00 по Москве, Минский ЧФ (регистрация) — 28 октября, 11:00 по Москве, ЧФ в Санкт-Петербурге (регистрация) — 3 ноября в 12:00 по Москве.

Команды, участвующие в официальной версии одного из четвертьфиналов, могут поучаствовать в онлайн-версиях остальных четвертьфиналов. Команды, не участвующие ни в одном из официальных четвертьфиналов, могут принять участие онлайн во всех трех раундах. Результаты каждой команды на всех соревнованиях, официальных и неофициальных, будут учтены, итоговый зачет турнира будет производиться по системе Гран При 30.

Регистрация на онлайн-версию каждого четвертьфинала идет непрерывно вплоть до старта соревнования. Создать команду в системе Яндекс.Contest вы можете по ссылке «Мои команды». Все приглашенные в команду участники должны подтвердить своё участие в соревновании. После успешного создания команды необходимо зарегистрироваться на соревнование, указав вашу команду.

Правила отдельных раундов совпадают с правилами официальных четвертьфиналов.

Потренироваться сдавать задачи в системе Яндекс.Contest можно, приняв участие в A + B virtual.

На ваши вопросы и комментарии к этому посту могут отвечать несколько человек, кроме меня: Владимир Тен (vtenity), Лев Толмачев (lev.tolmachev), Виталик Гольдштейн (goldvitaly), Олег Христенко (snarknews).

Следите за обновлениями!

UPD. Онлайн раунд московского четвертьфинала стартует 21 октября в 14:00 по Москве, чтобы все могли поучаствовать в Codeforces Round 146 и CodeChef cook-off.

UPD.2 Появились ссылки для регистрации на все три ЧФ и точные времена их проведения:

  1. Московский ЧФ — 21 октября, 14:00 по Москве.
  2. Минский ЧФ — 28 октября, 11:00 по Москве.
  3. ЧФ в Санкт-Петербурге — 3 ноября в 12:00 по Москве.

UPD.3 В таблице результатов доступны результаты как онлайн-тура, так и официального тура московского четвертьфинала. Команды, поучаствовавшие в официальном московском четвертьфинале и регистрирующиеся на остальные туры, если они желают, чтобы их результаты были зачтены в турнире, должны указать в отображаемом имени команды в системе Яндекс.Contest строку, совпадающую или максимально похожую на ту, которая отображалась в мониторе московского четвертьфинала. Команды, поучаствовавшие в онлайн-версии московского четвертьфинала и являющиеся участниками официальных четвертьфиналов в Минске или Санкт-Петербурге, должны указать отображаемое имя в системе Яндекс.Contest, совпадающее или максимально похожее на официальное название команды.

UPD.4 Опубликован объединенный монитор двух прошедших туров по системе Гран При 30. В случае равенства очков по системе Гран При 30 мы дополнительно ранжируем команды по суммарному рейтингу по системе ИТМО, как на Открытом Кубке. Приносим свои извинения, что система разрешения ничьих не была опубликована изначально. Обращаем внимание команд, что склейка результатов производится по отображаемому имени. Команды, у которых не склеились результаты, отписывайтесь в комментариях. В третьем раунде проставьте себе ровно такое же отображаемое имя, как имя в объединенном мониторе. Мы даже собираемся с началом третьего раунда (точнее, как только хотя бы одна команда совершит посылку) в объединенный монитор добавить и третий раунд и надеемся, что объединенный монитор после этого будет показывать текущую ситуацию в каждый момент времени с учетом положения команд в третьем раунде турнира. Ясно, что для команд, участвующих в официальном четвертьфинале в Санкт-Петербурге, изменятся отображаемые имена, и потребуется некоторое время на их склейку.

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

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

Что слышно о заявленом мероприятии? Состоится? Осталась неделя до Московского ЧФ и хотелось бы иметь информацию для планирования тренировок и участия в контестах.

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

А на английском языке задачи будут?

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

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

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

А где задачи, а то соревнование уже началось?

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

Условия задачи выдают "Сервис временно недоступен"

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

У меня одного сервис временно недоступен?

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

can't download problem statement (PDF file)

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

Походу все контесты сегодня будут откладывать на 10 минут)

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

Теперь задачи из пробного тура :)

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

У меня одного такие опасные задачи по ссылке?

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

Да что за фигня. Теперь там задачи пробного тура Яндекс тренировок.

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

Что-то никто ничего не пишет, у вас уже работает? У меня все еще кроме ленты новостей ничего не грузится(соревнования пустая страница).

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

    Уже 45 минут контест идет. Пустая страница — какая-то старая версия браузера, видимо. Я сам на это когда-то жаловался, обещали поправить...

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

Как-то не хватает часов с остатком времени рядом с табличкой.

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

За какую сложность решалась B? У меня динамика за O(N·A3·B2) получает ТЛ 9. Надо было ее оптимизировать или можно проще?

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

    А там что, надо 3 билета держать на руках????

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

    У меня сложность, кажется, O(n B^4 A log что-то), но много отсекается. Решение такое. Сразу поэлементно сложим последовательности, получим последовательность из n нулей, единиц и двоек. Будем двигать окно длиной B по дням. Для каждого положения будем хранить мапу из кортежа значений в этом окне в минимальное количество действий, чтобы такого кортежа достичь (обнулив все левее окна и не трогая все правее). Но будем рассматривать не все кортежи, а только "разумные", то есть достижимые при "разумном" использовании билетов. При каждом положении окна запустим дейкстру по этой мапе, храня пометки в сете. Вершина — кортеж значений в окне, переход — купить билет ровно на этот период времени и каким-то "разумным" образом распределить его поездки внутри окна. Разумное использование билета — выбрать некоторое k и уменьшить первые k единиц до нулей и первые A-k двоек до единиц. После дейкстры посмотрим на все кортежи с нулевым первым элементов и для них сдвинем окно на 1 вправо, получая начальные кортежи для следующего положения окна. Достижимых вершин для каждого положения окна, кажется, O(B^3). Несмотря на длиный текст, пишется очень просто.

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

Как нормально решать Е? Миллион ифов и WA22.

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

А как J решать? Мы посылали quicksort, и получали WA13. Интерактор заваливал его?

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

    У нас прошел обычный Mergesort. А Quicksort заваливался. Его интерактивно несложно завалить.

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

      Блиин, всё настолько просто. Спасибо.

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

      Приведите, пожалуйста, пример по заваливанию рэндомизированного qsort в интерактиве

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

        Например, на каждый запрос (a < b) интерактор возвращает false если a == b, либо если уже просили сравнить (b < a) и тогда вернули true. В остальных случаях возвращать true.

        Тогда, по-видимому, классический quicksort с рандомным выбором элемента будет заваливаться: каждый раз подмассив a[l..r] будет разделяться на очень неравные части.

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

          Это не совсем корректный тест, по условию a == b быть не может, но вот возвращая все время false повалить можно. Спасибо, идея ясна.

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

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

            bool cmp(int a, int b)
            {
              if (a == b)
                return false;
              if (d[a][b]) // если уже просили сравнивать a с b
                return d[a][b] == 1;
              d[a][b] = 1;
              d[b][a] = -1;
              return true;
            }
            
            • »
              »
              »
              »
              »
              »
              »
              14 лет назад, скрыть # ^ |
               
              Проголосовать: нравится 0 Проголосовать: не нравится

              В условии прописано, что для любой пары ламп, джин точно знает, какая из них ему нравится больше. Поэтому условие if (a == b) никогда не выполнится. Да это так, придирки.

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

    У нас quicksort на линейном порядке с медианой трёх случайных элементов в качестве опорного валился примерно на 15% запусков, посылать не рискнули.

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

    Я не знаю, верно ли то, что я скажу далее. На сколько я понял(переводчик из меня фиговый), что в случае невозможности построить последовательность, то нужно вывести n + 1 0. В qs может возникнуть такая ситуация, что если построить орграф с ребром a-b, означающим, что b > a, то может появиться цикл, что как бы совсем плохо. Строго не доказывал, но проверял на существование этого цикла. Возможно я не прав.

    P.S. Писал merge, скорее всего там цикла быть не может 100%. Но qs совсем другая.

    P.P.S. Описанный выше способ с бинарным поиском — это вновь изобретенный велосипед. Называется сортировкой бинарными вставками

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

а что такое 18+, 16+... рядом с задачами? возрастные ограничения или сложность?

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

Кто-нибудь в курсе, что за трешня с табличкой в итоге? Сперва продлили, потом вырубили за 5 минут до конца по service unavailable, сейчас показывает, что финальное время 5:35

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

    Кое-какие накладки со временем начала. Подробнее ответит жюри, если посчитает нужным.

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

    В одной из аудиторий МГУ произошёл сбой, из-за которого старт для этой аудитории был отложен на 35 минут (дисплеи у участников были выключены; дежурный ошибочно ожидал устной команды о начале контеста). Соответственно, только для этой аудитории турнир продлили.

    Кроме того, по техническим причинам (различные инструкции, выданные дежурным площадок) команды, пишущие в остальных аудиториях МГУ, получили условия на 7 минут позже команд в МФТИ.

    При подведении итогов жюри пересчитало результаты с помощью электронных таблиц; так как оба сдвига не повлияли на распределение призовых мест и путёвок в полуфинал, то было решено не затягивать закрытие и оставить в предварительных результатах всё "как есть".

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

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

Как решать H и G?

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

    G: подвесим дерево за какую-то вершину, обойдем dfs, если во время обхода dfs направление ребра совпадает с направлением dfs по этому ребру, запишем на ребре 1цу, иначе 0. будем хранить для каждой вершины сумму ребер до нее от корня, а так же, ее глубину.
    когда поступает запрос x, y: нужно чтобы все ребра от lca(x, y) до y были сонаправлены обходу dfs, а ребра от x до lca(x, y) противоположнонаправлены обходу dfs. это проверяется просто, если сумма х (по ребрам, которую мы храним) — сумма lca(x, y) = длине пути от x до lca(x, y), а сумма y — сумма lca(x, y) = 0, то "Yes", иначе "No"

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

А как предполагалось решать задачу D? У нас O(NlogN) получало TL20. Причем на случайном макстесте работало локально от 3 до 6 секунд.

Есть ли какое-нибудь линейное решение задачи?

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

    На разборе рассказывали за (N log N + M log N). Суф. массив плюс хитрый стек возможных максимумов при фиксированной правой границей, двигаем правую границу постепенно слева направо, плюс RMQ.

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

    На разборе NlogN решение рассказывали.

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

    Нужна любая структура, которая умеет сравнивать суффиксы и искать lcp (даже хеши сойдут). Далее, можно решить задачу оффлайн — посортить запросы по правому концу, далее двигаем правый конец и поддерживаем 2 множества: для данного правого конца r множество суффиксов всей строки, начинающихся не правее r, которые бывают максимальными (это халява), и множество суффиксов префикса, заканчивающегося в r, которые бывают максимальными (это уже сложнее; будем добавлять туда все встречающиеся префиксы, а в процессе строить граф, если мы не добавляем в первое множество суффикс, начинающийся в r, то добавляем дугу из него в самый короткий элемент первого множества M; и удаляем r и всё, достижимое по дугам, из второго множества в момент времени r + LCP(r, M)).

    Upd: Ну и понятно, как обрабатывать запросы, имея второе множество: это просто запрос минимума на отрезке.

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

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

      А у жюри есть решение на Java (желательно без хешей)?

      А то что-то даже в дорешивание не удается пропихнуть, и запас хаков уже исчерпан.

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

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

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

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

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

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

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

        Для четвертьфинала суф массив проходил с запасом, видимо на contest.yandex.ru кэш у машинок поменьше, а тл выставлялся по решению с хэшами, которое летало. Я попросил увеличить тл и провести реджадж на виртуальном контесте.

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

А кто сдал H, как? Мы придумали в две динамики за квадрат (количество путей, количество изолированных вершин) => (число способов, среднее), но свалились по #TLE из-за того, что пришлось считать в логарифмах.

Кстати, либо gcc тупит, либо сервер медленный — у меня локально на далеко не топовом ноутбуке решение из-под вижака работает 1.8 секунды, а на сервере оно не лезет в TL.

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

    Считали те же две динамики, но без логарифмов. Чтобы первая динамика не вылезала за экспоненту дабла, делили перед пересчетом всю строчку на одно и то же число.

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

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

      Кстати, решение с логарифмами все-таки заталкивается под самую границу, если хорошо работать с памятью, выставить отсечение точно (2*i + j <= 4000) и не считать среднее в логарифмах.

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

    У меня было 2 динамики. Первая f(n, k) говорит, сколько есть перестановок из n элементов среди которых k выделенных могут принадлежать циклам длины 1, а остальные — нет. Вторая g(n, k) — это то же самое, только не количество перестановок, а суммарное количество циклов в них. Чтобы ничего не переполнялось, сразу считаем это количество, деленное на n!. Для этого каждый раз при переходе делим результат на n.

    Если у нас вся перестановка неизвестная, то ответ равен . В общем случае, посчитаем сколько уже есть циклов (пусть это количество равно c), а также сколько есть цепочек (k) и сколько неизвестных позиций (d). Тогда ответ равен .

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

    У нас линейное решение.

    Считаем такую велечину f[n] = 1 + 1/2 + ... + 1/n это средние число циклов в перестановке длины n. Пусть у нас цепочек a, изолированных точек b, законченых циклов c потом считаем велечину

    d = Sum[i = 0, i <= b, C(b, i) * (a + b — i)! * (f[a + b — i] + i + c)(-1) ^ i]

    e = Sum[i = 0, i <= b, C(b, i) * (a + b — i)! * (-1) ^ i]

    d — это суммарное число циклов в хороших перестановках e — число хороших перестановок

    ну и ответ собствено d / e и считали всё в логарифмах

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

Кто-нибудь знает, почему в Java рекурсия глубины 10^5, с одним int в параметре получает stackoverflow?

Java version "1.6.0_20" OpenJDK Runtime Environment (IcedTea6 1.9.10) (6b20-1.9.10-0ubuntu1~10.04.3) OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)

Запускается с параметрами -Xmx512M -Xss64M

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

В К у кого-нибудь были проблемы с хэшами?

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

Время до окончания контеста (в правом верхнем углу) криво показывается: иногда показывается правильно, а иногда — на час меньше.

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

Что-то новенькое от Яндекса: сразу показывать полные результаты виртуальных участников.

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

Если вам понравились задачи Western subregional contest 2012, то плюсуем (ну и минусуем те, кому не понравился)!!! Так же хочу услышать ваше мнение о нашем проблемсете! Спасибо. [моя один из авторов]

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

Что за фигня?? Почему постоянно пропадает монитор, вкладка соревнования и т.п.? Просто белый экран.

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

The interface worked really slow for me. Did it happen to other people too?

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

Так все-таки, контест будет продлен?

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

Даже Codeforces меньше тупит!!!!!!!

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

Что надо было в F сделать?

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

    Рекурсивное решение. Разбиваем множество вершин на 2 равных. Решаем задачу для каждого множества. Затем соединяем каждую веришну из первого множества с каждой вершиной из второго, используя наименьший цвет, который не использовался в раскрассках этих множеств. Когда только 1 вершина ничего не делаем. Получается цветов O(logN).

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

      Там abacaba нужной длины надо вывести в каждой строчке. Вроде как раз это и получается.

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

      берём смотрим на двоичные разложения номеров двух вершин, находим какой-нибудь бит, который в этих разложениях отличается, красим ребро между этими двумя вершинами в соответствующий номеру бита цвет (каждому номеру бита ставим в соответствие свой уникальный цвет). Несожно видеть что а) по каждому цвету будет двудольный граф б) цветов задействовано верхняя целая часть log_2(N). Получаем AC.

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

Какие-нибудь идеи как решать L? Или хотя бы как понять условие. По словам niyaznigmatul я понял, что там есть что-то еще кроме отсутствия вершин связных с тремя попарно несвязными.

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

    Граф обладает двумя свойствами:
    1. Если рассмотреть множество вершин N(v) (соседи вершины v), то граф на этих вершинах связный
    2. В графе нет подграфов K1,3.

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

      А как можно было понять первое?

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

        "The news about the success of any contestant passes from any of his acquaintances to all his acquaintances (probably through other people). Two persons do not communicate unless they know each other and when they do, they only discuss people they both know, but not themselves."

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

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

    Я решал так:

    1) начинаем с треугольника 2) если можно куда-то вставить вершину в цикл, вставляем 3) если нет, но еще есть вершины, связанные с циклом, то нетрудно видеть, что будут вершины, соединенные с как минимум двумя вершинами цикла, скажем пусть вершина a соединена с v_i и v_j. Тогда заметим, что v_{i-1} и v_{i+1} обязательно соединены, и v_{j-1} и v_{j+1} обязательно соединены. Тогда нам достаточно одного из следующих ребер, чтобы перестроить цикл, включив в него a: v_i-v_{j-1}, v_i-v{j+1}, v_{i-1}-v_j, v{i-1}-v{j+1}, v{i+1}-v{j-1}, v_{i+1}-v_j, так же достаточно, если i+1=j-1 или i-1=j+1. Дальше я просто пытался найти такую тройку a, v_i, v_j, чтобы одно из этих условий было выполнено, и это почему-то всегда получается. Я пытался доказать, что это всегда получится, но не смог :)

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

      Ну я пытался делать что-то такое же. Но без первого условия у меня был контрпример. Надо отметить, что ни мы, ни Angry Maffin этого условия не заметили. И думаю мы такие не одни.

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

      Доказать это не получится. Пример графа:

      • 9 24
      • 1 2
      • 1 3
      • 2 3
      • 2 4
      • 3 4
      • 3 5
      • 4 5
      • 4 6
      • 5 6
      • 5 7
      • 6 7
      • 6 8
      • 7 8
      • 7 1
      • 8 1
      • 8 2
      • 1 9
      • 5 9
      • 1 5
      • 3 6
      • 3 8
      • 7 2
      • 7 4
      • 3 7

      Если в нём построить цикл 1 2 3 4 5 6 7 8 1 и попытаться описанным способом добавить вершину 9, то это не выйдет. (Именно такой цикл может быть построен последовательным добавлением вершин, смежных с парой соседних по циклу: 2 4 7 2, 2 4 6 7 2, 2 4 6 7 8 2, 2 4 5 6 7 8 2, 2 3 4 5 6 7 8 2, 1 2 3 4 5 6 7 8 1.) Но чтобы получить тест, на котором решение «упадёт», требуется перенумеровать определённым образом вершины. Аналитически это сделать сложно из-за использования HashSet'а. Возможно, такой перенумерации для этого графа и не существует, но идея может использоваться в других примерах.

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

        Все понял, повезло :) А как правильно — чуть докрутить это, или что-то совсем другое?

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

          Да, тесты были не очень качественные, потому что сложно придумывать неправильные решения, когда хорошо знаешь, что делать в более широком классе графов:)

          Основа идеи — полная циклическая расширяемость таких графов (при очевидно необходимом условии связности) — правильная. А дальше у меня всё совсем по-другому:) Пусть у нас есть граф G, цикл C и вершина , смежная с . Построим цепь от x до ближайшего из соседей v по циклу (до u), содержащую только вершины из окружения v (такая цепь существует в виду локальной связности). Теперь возьмём на этой цепи ближайшую к u вершину . Если y смежна с u (и с v по определению цепи, которой y принадлежит), то всё очевидно. Иначе она не смежна и со вторым соседом v (поскольку u ближе), тогда соседи v смежны, значит, можно «изъять» v из цикла. Теперь, пройдём по цепи от y до u и индуктивно покажем, что либо мы уже умеем расширять цикл, либо верно следующее. (Пусть z текущая вершина цепи, а s — следующая.)

          • Соседи каждой вершины цепи от y до z смежны между собой.
          • Никакие две вершины цепи от y до z не являются соседями по циклу.

          А значит, все вершины цепи от y до z можно изъять из цикла (одновременно).

          Если z смежна с соседом t по циклу для s, то мы сможем изъять все вершины цепи от y до z, а также v, смежную с s и «встроить» всю эту конструкцию вместо ребра st. (Если s = u, вершину v не нужно изымать.) Если же z не смежна с соседями s, то соседи s смежны между собой и s также можно «изъять».

          Если сосед t вершины s смежен с v, можно изъять всю цепь от y до z, а также вершину v и встроить вместо ребра st. Значит, среди вершин цепи от y до z нету двух соседей по циклу.

          Остаётся заметить, что рано или поздно, очередная вершина цепи будет смежна с соседом следующей, поскольку каждая вершина цепи смежна с v — соседом u (конца цепи).

          Изложение громоздкое, но идея, надеюсь, прозрачная.

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

            Да, все понятно, круто! Это сильно круче моего решения — я дошел только до выбора y фактически.

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

    Извиняюсь, я криво прочитал условие.

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

I'm getting WA in test case 3 on problem I. I'm solving it as vertex cover of a tree (building the trie and considering the empty string is not allowed). I tried testing it with various tests and it 's giving the right answers. Does the idea seem to make sense? Is there some special tricky case?

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

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

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

Расскажите как решать D и K с Минского контеста?

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

    D: 2 раза применить алгоритм описанный здесь: раз для опредиления порядка в котором будут йти лабки в каждой контрольной, и раз в каком порядку будем писать лабки.

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

    K. Для маленьких (<100) напишем перебор. Для четных. Решим для (n-8)/2, умножим все на 2, добавим две 4. Для нечетных. Решим для (n-9)/2, умножим все на 2, добавим 3 и 6.

    P.S. Это решение от niyaznigmatul. Мы писали такое же но посложнее. Мы для остатков по модулю 6 делали. Для четных так же. Для кратных трем (3n-6)/6 и прибавить 3 и 3. Для остатка 5- потом добавить 2 и 3. А для остатка 1. Решить для (n-55)/6 и добавить (2,4,21,28).

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

      K. Для всех чисел напишем перебор :) Переходы будут двух видов: заменить число 1/n на k чисел 1/(nk), либо заменить число 1/n на 1/(n+1) + 1/(n * (n + 1)). Возможных переходов первого вида довольного много, поэтому будем делать лишь тот, который максимально приближает сумму к заданной.

      Это решение работало почти мгновенно для больших n, а для маленьких почему-то несколько ответов не находилось :) Пришлось вписать их руками.

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

        Я сейчас в дорешивании сдал похожее решение. У меня тоже 2 перехода: либо заменить 1/n на 2 числа 1/(2*n) и 1/(2*n), либо заменить число 1/(2*n) на 2 числа 1/(6*n) и 1/(3*n). Только для трех маленьких тестов оно не нашло решения и пришлось запустить перебор, когда n ≤ 55.

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

      А у меня без ручных случаев :) Для <100 напишем перебор. Для больших n вместо ручного кодирования 1/2+1/4+1/4 и 1/2+1/3+1/6, просто пытался брать все разложения из перебора для <100. Не сильно меньше кода, но чуть меньше думать надо :)

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

    Задача D. Вроде никто пока нормально не объяснил.

    Пусть у нас есть 2 лабы, и мы сначала сдаем первую (в момент времени t). Тогда мы получим штраф, равный w[1] * t + w[2] * (t + p[1]).
    А если мы сдаем сначала вторую, а потом первую, мы получаем штраф w[2] * t + w[1] * (t + p[2]).
    Эти два значения отличаются на величину w[2] * p[1] — w[1] * p[2]. Если она меньше нуля, выгоднее первый случай, иначе — второй. Теперь можно посортить все лабы в данном предмете с этим компаратором.

    Теперь посмотрим, чем равен штраф в группе из k лаб, если начинали мы так же в момент времени t. Он равен w[1] * t + w[2] * (t + p[1]) + ... + w[k] * (t + p[1] + ... + p[k-1]).
    Здесь имеют значение только слагаемые (w[1] + ... + w[k]) * t, т.к. оставшиеся произведения (обозначим их за X для краткости) не зависят от времени сдачи лабы.
    Соответственно, если сдавать сначала первую группу лаб, а потом вторую, то штраф будет равен (sum_w1 * t + X1) + (sum_w2 * (t + sum_p1) + X2), а если сначала вторую, а потом первую — то (sum_w2 * t + X2) + (sum_w1 * (t + sum_p2) + X1). Видно, что они отличаются на величину sum_w2 * sum_p1 — sum_w1 * sum_p2. Отсортив группы лаб по этому компаратору, получаем искомое разбиение.

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

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

Как решать А?

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

    Рассмотрим строку T = S + S из которой удален последний символ. Тогда все циклические сдвиги — это подстроки длины n = |S| этой строки.

    Разобьем наш шаблон на части q1, q2, ..., qk из букв, которые находятся между звездочками. Тогда если мы хотим проверить подстроку [l, r] строки T на то, подходит ли она к шаблону, достаточно чтобы части qi присутствовали между l и r в качестве подпоследовательности, причем между собой не пересекались. Дополнительно накладывается следующее условие: если шаблон не начинается со звездочки, то начало q1 должно быть в позиции l. Аналогично, если шаблон не заканчивается на звездочку, то qk должно заканчиваться в позиции r.

    Чтобы это все проверить, достаточно пройти по строке T справа налево и поддерживать динамику f(pos, i) -- самое раннее возможное окончание куска qk, если мы начинаем прикладывать кусок qi к позиции pos или правее. Она довольно просто пересчитывается.

    Сложность O(|S|·|Pattern|).

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

Как решать B?

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

    Тернарным поиском по углу наклона боковой стороны

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

    я знаю человека, который сдал перебор угла наклона с точностью 10^-6

    PS. если не знать тернарный поиск, можно было еще бинпоиском по производной

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

      Я знаю одну команду, где просто нашли сами корни производной.

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

        они, случаем, не упоротые? там же бешеная производная

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

          А как, кстати, не упоротые доказывали, что в этой задаче можно делать тернарный поиск?

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

            Мне кажется, что когда написать решение занимает примерно 3 минуты времени, и тестирование идет сразу на всех тестах, доказательство — пустая трата времени

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

              А как предлагается тестировать решение? Штрафные попытки тратить?

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

                Да. Это гембл, безусловно, но чаще всего оправданный. Особенно когда пишешь лично, а не командой

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

                Да. В геометрии обычно либо прокатывает, либо многоугольники и в формуле какие-то min/max/etc.

                Ну либо сказать, что функция непрерывная и не особо упоротая, сделать 104 тернарников на маленьких отрезках и выбрать лучшее решение.

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

      На самом деле, тернарный поиск — штука, которую можно сделать немного похожей на бинарный поиск по производной. Во всяком, случае, те две точки(которые обычно выбираются как l + (r - l) / 3 и r - (r - l) / 3) можно выбирать сколько угодно близкими друг другу(это как минимум улучшит время работы в маленькую константу раз), а поскольку от производной для выбора следующего интервала требуется только знак, то этот знак будет совпадать с разностью значений в точках, например r - 0.49(r - l) и l + 0.49(r - l) .

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

Как решается задача D (Western QF) ? Идея посортить хитро строки в порядке уменьшения длины префиксов (отдельно для каждой группы строк, начинающиеся с общего символа) не прошла 22 тест :-(