Пожалуйста, прочтите новое правило об ограничении использования AI-инструментов. ×

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

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

Сегодня в 20:00 по Москве состоится TCO 2013 Algorithm Round 2B. Участвовать могут те, кто прошёл по результатам предшествовавших Round 1 и не прошёл в следующий раунд по результатам Round 2A. Регистрация началась. Первые 50 мест из этого раунда проходят дальше в Round 3.

Впоследствии будет проведен ещё Round 2C по таким же правилам. В параллельных им раундах с такими же задачами смогут участвовать и те, кто уже прошёл в Round 3. Первые 350 мест с наивысшим результатом в общем зачёте по Round 2 получат футболки TopCoder Open (общий результат участника здесь определяется как наилучшее место среди всех тех Round 2A, Round 2B и Round 2C, где участник набрал более нуля очков).

Всем удачи!

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

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

Я никогда не пробовал, а в таких раундах участие вне конкурса бывает?

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

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

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

      А если мне нет 18, я не отбирался и не регистрировался на TCO? Я в нем могу участвовать?

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

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

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

Пару часов назад пребывал в состоянии "понимаю, что чего-то не понимаю", когда безрезультатно пытался зарегистрироваться на предстоящий раунд. Раунд — важный и ответственный, так что пытался и пытался. На мои тщетные попытки апплет реагировал сообщением вроде "Registration is available only by invitations". Каково же было мое удивление, когда я обнаружил себя на 50-м месте в Раунде 2A (и, следовательно, прошедшим в следующий). Удалили читеров?

Так что теперь с интересом жду окончания раунда — Edvard и NALP сидят неподалеку в Центре олимпиадной подготовки и напряженно думают.

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

На чем так массово попадала 500? Я совершенно не ожидал, что подпрыгну со 111 места до 45.

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

    У меня, по-видимому, TL. Непонятно как.

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

      А, нет, ML. Ненавижу этот TopCoder с его ML в 64 метра.

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

    Куча народу понаписала какое-то палево за 250 (которое ещё и непонятно, как челленджить), вот и попадала.

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

      Мне кажется можно завалить так: a и b образуют рандомные перестановки, c переводит каждый элемент в одно и то же подмножество размером 25. Я правда не успел попробовать :)

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

        По-моему, быстро найдется цикл... У нас же "одно и то же подмножество размера 25".

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

          Да, согласен. Тогда так: в a из 0 переход в подмножество [1,50) размером 25, b и c — рандомные перестановки [1,50).

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

    Я заслал бредятину — динамику за k*(n^4), проверяющую наличие пути длиной k в новом графе (вершины которого — пары вершин из старого).

    Понятно, что максимальный по длине путь без наличия цикла — это что-то порядка n^2, т.е. около 2500, но у меня это не лезло в ТЛ, поэтому послал с k=200))) Мне не удалось придумать пример, на котором получились бы более длинные пути.

    Вероятно, автору задачи это удалось))))

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

      Можно было просто найти длиннейший путь в новом графе, перебирая вершины в порядке топологической сортировки. А если есть цикл — ответ -1.

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

Как решать Hard?

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

    Я делал так:

    Зажимаем все единицы в прямоугольник w x h (чтобы на каждой стороне была хотя бы одна единица). Затем разбираю случаи (1 <= w <= sx) и (sx < w <= X) и то же самое c Y. Внутри каждого случая формула включения-исключения (на каждой стороне должны быть хотя бы одна единица).

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

500 решалась поиском циклов в графе на парах из двух вершин с ребрами (u,v) -> (p,q) если можно как-то пойти u->p v->q или u->q v->p, потом топсортом и нахождением длиннейщего пути?

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

    Еще надо было рассматривать переход u->p, u->q (тест 4).

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

    Нет, если можно пойти (u или v)->p и (u или v)->q. Это разные вещи.

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

Кто умеет челленджить "ленивый перебор по состоянию 2^{50}"?

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

    Ну, теперь то можно просто посмотреть тест

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

      Но не генератор)

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

        А, ну я придумал. Разобьем числа с 1 по 49 на много перестановок с взаимопростыми размерами (это второй вид транспорта). Первый же будет из нуля вести в по одному представителю от каждой перестановки. Тогда мы сначала пойдем 1, а потом будем ходить 2 очень долго (при этом снова пробуя один, но по один ходов нету)

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

Почему такое решение по easy правильно?

int ab = gcd(a, b);
int ac = gcd(a, c);
int bc = gcd(b, c);
if (ab == ac && ab == bc) return ac / 3;
return min(ab, min(ac, bc)) / 2;
  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -46 Проголосовать: не нравится

    Оно неправильно, я такое почелленжил. Тест: 2 2 4. Ответ — 0.

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

      Неправильно, когда if (a == b && b == c). А с сравнением gcd правильно. Мне тоже непонятно, почему.

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

      Да ну? ab=ac=bc=2 в этом тесте => оно выведет вполне себе правильный ответ — 0.

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

      Я так понимаю, спутано с

      if (ab == ac && ab == bc) return min(a,b,c) / 3;
      

      . Я слышал про зачалленджнутые решения такого типа.

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

    Ну, почему при равном общем НОД надо делить на 3, примерно понятно. Рассмотрим сначала случай для 2-х чисел. Почти очевидно, наилучшим будет расстояние НОД/2 (если неочевидно, то примерно можно так доказать: пусть две последовательности начинаются в одной точке. Тогда, найдется такой "отрезок", что расстояние между деревьями разных видов по краям отрезка будет равно точно НОДу (т.к. ДУ kx + ly = gcd(x,y) имеет решение), а остальные, очевидно, будут не меньше НОДа. При смещении одной из последовательностей куда-либо, с одной стороны, будет увеличиваться расстояние между "нулями", с другой, будет уменьшаться расстояние между вот теми точками, расстояние между которыми ровно НОД, и максимум расстояний будет достигнут, соответственно, при смещении на НОД/2)). С 3-мя последовательностями аналогично. А вот над неравными НОДами я еще думаю сейчас; на контесте придумал что-то подобное, но не смог полностью доказать и, в конечном итоге, писал стандартный перебор) Ну, в принципе, понятно, что т.к. для 2-х опт решение НОД / 2, то для 3-х верхней границей будет минимальный НОД, делённый на 2, но как при этом "упихать" туда 3-ю последовательность, я пока не знаю.

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

      Ну случаи с двумя и равными понятно. Не понятен основной случай.

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

Таблица с рангами на майку. Будет обновляться. Взяты с каждого раунда лучшие 349-350.

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

А может кто-нибудь рассказать решения по 250 и 500? Из обсуждений выше ничего не понятно.

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

    250.

    Заметим, что наименьшее расстояние между деревьями двух типов равняется min((pos1 — pos2) mod gcd(perod1, period2), (pos2 — pos1) mod gcd(period1, period2)). Зафиксируем начальную позицию деревьев первого типа в нуле, переберем начальные позиции двух других типов, вычисляя на каждой итерации попарные расстояния. Итого получим решение за 2000^2.

    500.

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

    Чтобы получить полиномиальное решение, следует заметить, что мы можем сократить количество состояний с 2^N до N^2, используя в качестве состояний пары вершин. Идея доказательства: если между какими-либо масками существовал путь длины K, то между парами, являющимися подмножествами наших масок, тоже будет существовать путь длины K (и наоборот). Нужно помнить, что из некоторых состояний, из которых не существует ребра в нашем уменьшенном графе, в исходном графе ребро таки существовало (и вело в проигрышное состояние), а из некоторых — нет (они сами по себе были проигрышными) — это нужно учесть при нахождении длиннейшего пути.

    P.S. Исходники моих решений тут.

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

      А почему второе расстояние достаточно перебирать до 2000? Кажется первое расстояние Δ b нужно перебирать до a, а второе Δ c до lcm(a, b).

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

        Кажется, таки до lcm попарных gcd-шек. Я сейчас слишком сонный, чтобы доказать, почему он небольшой.

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

        Перебираются же некоторые точки которые, которые будут формировать киви и грейпфрут, при этом если мы сказали, что яблоки имеют вид 0 + a*k, тогда Δ b лежит [0;b), а Δ c[0;c)

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

          Я ниже написал, что именно мне не понятно.

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

            Да нет, hydrastuff все верно говорит. Мы же не перебираем Δb до a: Поскольку все циклично, тогда для всех пар целых чисел (i, j): ai = aj (mod a) = Δa. Где ai = Δa + i * a. То же самое верно и для b и c. Следовательно достаточно перебрать Δb в отрезке [0;b) и Δc в отрезке [0;c).

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

        Если положение первого дерева мы фиксируем в нуле, то вариантов положения второго можно рассматривать b, а вариантов третьего — c, так как для каждого вида мы просто выбираем остаток от деления ВСЕХ позиций данного вида на соответствующий период.

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

          Да но для подсчета ответа нам важен остаток третьего не только по модулю первого, но и по модулю второго. А таких пар остатков вроде lcm.

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

            Ну, лично я делал так: пусть a — наибольший из интервалов. Зафиксируем одно из деревьев а в нуле. Тогда как минимум одно из деревьев k растет на [0, a-1], и как минимум одно из g растет на том же интервале. Всё, пара этих двух позиций полностью описывает нашу ситуацию. Более того, легко понять, что позицию дерева k имеет смысл перебирать от 1 до k, а позицию дерева g — от 1 до g, т.к. если у нас есть дерево вида g в позиции g + l, то дерево есть и в позиции l, очевидно. Насчет того, о чем вы говорите — остаток третьего по модулю второго — у нас есть смещение 2-го и 3-го относительно 1-го, из них двух мы можем получить смещение 2-го относительно 3-го.