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

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

Напоминаю, что этой ночью в 1-00 MSK состоится второй раунд Facebook hackercup.

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

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

3 часа продлится

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

Удачи вам!

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

А кому-то еще в Петрозаводске завтра контест писать...

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

    Ой как мы сочувствуем:) Вариант пропустить Facebook HC рассматривался?

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

    Туда вроде ради контестов и ездят:) Ловите два)

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

Ой, спасибо! Чуть не забыл!

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

Можно ли будет где-нибудь наблюдать за таблицей результатов?

UPD. Скорее всего тут.

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

Добавьте эту ссылку в тему: https://www.facebook.com/hackercup/problems.php?round=154897681286317

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

    Их нельзя прочитать, если не прошел :(

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

Меня несколько смущают последние 4 ответа 0/1 в последней. Может кто-нибудь потестить на моем инпате если не сложно?

upd: нашел косяк, не умею решать..., хотя если все же кто-то выложит ответ — буду благодарен

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

Как решать Sequence Slicing ?

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

    Элементы растут в среднем на 1. Зафиксируем начало отрезка и будем идти вправо, считая элементы которые еще не встречались, где-то через 100000 элементов новые будут встречаться периодически, то есть если среди N позиций 1-ая 4-ая и 9-ая была новой, то в следующих N на этих позициях тоже будут стоять новые числа. Кроме того если сдвинуть начало отрезка на N в любую сторону, то "новые" элементы тоже сдвинутся. Получается, что достаточно перебрать начало отрезка от 0 до N - 1, посчитать где должен быть его конец x, он на промежутке

    Unable to parse markup [type=CF_TEX]

    тоже смещается вправо, и посчитав сумму арифметической прогрессии R - R1, R - (R1 + N), ... мы учтём все отрезки, начало которых делится на N с определённым остатком.
  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Не успел докодить. решение такое. Пусть мы знаем отрезок [a, b]. Тогда посчитаем в нем количество различных чисел. Для начала разобьем этот отрезок на N подпоследовотельностей, возможно, некоторые будут пустые, такие что в каждой из них у нас индексы элементов сравнимы по модулю N. Получили N таких подпоследовательностей. В каждой из них мы можем легко найти первый и последний элемент. Теперь давайте пробежимся по каждой из таких последовательнстей. Мы можем узнать остаток от деления на N первого элемента в каждой из них ( а каждая такая последовательность — это арифметическая прогрессия с разностью N). Тогда, если мы запомним для каждого rem какие последовательности были, то есть первый член и последний, то мы тогда получим что у нас для каждого rem есть набор отрезков ( вида rem + xN, rem + yN, где x, y — нам уже известны). Тогда посчитаем их длину их пересечения. Это будет число различных чисел для данного остатка. Проитерировав по всем остаткам, получим общее число различных числе для отрезка [a,b]. Теперь давайте решать исходную задачу. Перебираем индекс a = 0, ... , N — 1 Дихотомией перебираем индекс b. пусть мы нашли, что нам подходит [a, b]. Тогда понятно, что и [a, b + delta] подходит, а также будет подходить отрезок [a + N, b + N]. Тогда мы можем посчитать число валидных отрезков. начинающихся от этого элемента. Посчитаем общее число валидных и выведем ответ.

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

      upd: нет. видимо n^2 log n. ОК. Чтобы это написать оставалось пару строк, дебажил какую-то фигню)

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

        n ^ 2 log n log k вроде бы как. Ведь мы перебираем старт, для него дихотомией решаем задачи за ассимптотику n log n.

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

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

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

            да неоткуда ей взяться.

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

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

              Да, сейчас допер уже, что не откуда. просто считал что проверка по n модулям, каждая за o(n) итого n^2, а потом понял, что там каждое число как раз 1 раз используется и o(n) в сумме.

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

Объясните кто-нибудь и первые две тогда

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

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

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

      То есть ответ можно найти так: n-k+h, где k-кол-во компонент связности, h — кол-во рёбер, у которойх оба конца — неважные города?

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

        А не.. тупанул. Я решал двумя обходами... видимо именно как у вас написано.

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

        полная формула: (M - (N - S)) - (M1 - (N1 - S1)) где S это кол-во компонент связности, а 1 это то же самое, но только по неважным городам. Первое слагаемое в формуле — это сколько надо удалить рёбер чтобы получилось дерево, второе — сколько рёбер всё-таки не надо удалять.

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

      Подскажите, пожалуйста, как искать компоненты связности в графе? Пробовал Тарджана Тарджана, однако на первом примере в описании проблемы, выдавал только одну компоненту :(

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

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

        UPD: Кстати, в первом примере на самом деле одна компонента, так что Тарьян прав =)

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

          Ок, теперь ясно. Однако, к алгоритму Тарьяна я пришел только затем, чтобы найти циклы в графе. Никак не могу найти внятного объяснения как же всё-таки циклы находить. Не знаете, где можно почитать?

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

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

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

        Можно и с помощью СРМ, по очереди добавляем все ребра, и потом смотрим число корней.

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

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

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

    Во второй, рассмотрим такое бинарное дерево, терминальные вершины — это вершины, которые пока не боссы и не подчиненные (компоненты размера 1). При появлении связи (u, v) найдем каким компонентам принадлежат вершины u, v — пусть это c1, c2, тогда найдем в дереве узлы, соответсвующие с1 и с2, создадим новую вершину, которая будет иметь два сына — узел для c1, для c2, т.е. теперь новая вершина соотвествует компоненте c1+c2. После это построения можно сделать динамику F(i,j) — минимальная высота дерева с корнем в i с учетом того что кол-во сыновей (характеристика, которая ограничивается D) должно быть <= i.

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

    Я в первой использовал систему непересекающихся множеств... Сначала объединял все множества рёбрами, на концах которых нет важных городов, потом добавлял оставшиеся дороги. Когда добавлял очередную дорогу, хотя бы на одном конце которой есть важный город, считал количество попыток объединений множеств с "самим собой"

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

    Немного другое решение второй. Будем по очереди объединять компании и для каждой хранить список людей, которые могут быть директорами. Для каждого из таких кандидатов в директора храним минимальный уровень который при нем достигается и количество непосредственных подчиненных (тут оно не зависит от способов объединения). Соответсвенно, при сливании компаний эти значения легко пересчитываются. Чтобы понимать кто в какой комании я, недолго думая, сделал СНМ. Трудоемкость такого решения оценить, правда, сложновато, но, вроде как, это что-то около О(ND). По крайней мере даже на питоне работает весьма шустро, да и пишется быстро.

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

Резы появились, круто быть 99, учитывая что до разморозки был 166)

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

    Поздравляю :) Сам тоже доволен, как слон, до разморозки был 161 :)

    Что-то я как-то... Проснулся даже

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

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

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

    Инпут где взять? Или свой?

    P.S. И да, там теперь можно скачать решение чьё угодно, можно взять любое подходящее и прогнать на своих тестах

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

      Ой... что-то я туплю... своё то решение оттуда взял :) Спасибо!

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

Круто, лег спать за 2 часа до конца раунда и занял 41 место:) А еще всю ночь кошмары снились про то, что первая задача упала