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

Автор Sultan, 15 лет назад, По-русски
Сегодня в 20.00 по МСК состоится очередной SRM. Будем надеяться, что он пройдет без каких-либо заминок. Желаю всем удачи.
  • Проголосовать: нравится
  • +20
  • Проголосовать: не нравится

»
15 лет назад, скрыть # |
 
Проголосовать: нравится -25 Проголосовать: не нравится
Vsem udachi!
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Сейчас время 18:09 (МСК) : У кого нибудь заходит в арену?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится
А я напоминаю что арена показывает неправильное время, которое на час опаздывает.
»
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится +19 Проголосовать: не нравится

Я один не могу зайти в комнату?

UPD: Отлично, зашел, зато теперь не могу открыть задачи.

»
15 лет назад, скрыть # |
 
Проголосовать: нравится +28 Проголосовать: не нравится
Ждем 528.5?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится
я внутри...
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится
Задачи не открываются :( Видимо таймер у них там сбился.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
Надеюсь задачи так не подведут.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится
Ср дек 28, 7:17 PM MSK  CODING

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

Сдвинули на 8:17 по Москве.

Надеюсь, room assignment останется прежним.

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

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

»
15 лет назад, скрыть # |
 
Проголосовать: нравится +27 Проголосовать: не нравится
Каким прекрасным SRMом завершился этот год, похоже ребята на топкодере уже вовсю празднуют.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
заманчивое начало)
»
15 лет назад, скрыть # |
 
Проголосовать: нравится -9 Проголосовать: не нравится
создаю анонимный фонд засравших раунд! присоединяйтесь!
»
15 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится +1 Проголосовать: не нравится

Вот это мясо. Я по B в своём духе написал самое сложное, что только может прийти в голову. Динамика за 2(n / 2) * n3 с пятью оптимайзами тащит :-)
В результате угрохал время контеста куда-то в задни^W чёрную дыру.

  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Как ты там по-человечески хранил 250?
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +8 Проголосовать: не нравится
    Товарищи красные, а правильно ли такое решение 500?

    Возьмем первые n/2 символов, далее для каждой маски:
      Найдем начала строчек a и b, которые войдут в x и y.
      Пусть для определенности a длиннее b. Тогда если a[1..blen] == b[1..blen], обновим в мапе, сколько раз встречается строчка a[blen+1..alen].

    Потом проделаем почти такую же операцию для вторых n/2 символов и второй мапы. Только там надо кое-что реверсить.

    Далее пройдемся по всем строкам из первой мапы и попробуем найти их во второй. Если получилось, прибавим к ответу m1[s]*m2[s].

    Еще, конечно, строки можно делать числами, а мапы - массивами (последнее я не успел). Получается за O(n * 2^(n/2))
    • »
      »
      »
      15 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

      Я так примерно делал.

      Со строками локально работало порядка 8 секунд на 'o' x 40, переделал на маски - в арене работало 1.5 секунды.

      И там не просто посчитать сколько раз такая строка была, а надо еще вроде сохранять какая именно строка была длинее и потом sum( m1[<num, s>] * m2[<1 - num, s>]. И отдельно учесть пустые строки.

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

        И там не просто посчитать сколько раз такая строка была, а надо еще вроде сохранять какая именно строка была длинее и потом sum( m1[<num, s>] * m2[<1 - num, s>]. И отдельно учесть пустые строки.

        Да, это я учел. У меня локально работает 1.3 сек, и почему-то кажется, что мой Core 2 Duo E6600 четырехлетней давности побыстрее их компов

        UPD: Зашло. Жаль, с 250 протупил

»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Обычный вопрос - как делается хард? Я на претесты итеративный метод впихнул (на каждом шаге храним несколько лучших массивов, как только мы не можем сделать следующий шаг, мы нашли ответ), но он свалится хотя бы по тайм-лимиту.
  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 4  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Есть некоторое решение, не уверен что правильное.


    1. Нам надо найти набор xi, yi такой что 
    a) 
    b)
    c)
    d) максимальна. 

    2. Ответ не превосходит 2000.
    3. При ответе больше 40 можно делать бинпоиск, так как второе условие выполнено автоматически
    4. Перебрали ответ до 40 и бинпоиск дальше.
    5. При фиксированном ответе какая-то очевидная динамика нужна.

    UPD: Судя по всему это лажа. Буду рад если кто-то объяснит где.
    UPD2: А нет не лажа - просто ТЛ.
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Видимо, основное ограничение — P1, P2 >= 50.

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

    Идея решения у меня такая: смотрим на цвета по очереди и для каждого решаем, сколько раз отнять от него P1 и сколько раз отнять P2. Считаем динамикой ответ для состояний (количество просмотренных цветов, сколько у нас свободных P1-ок, сколько у нас свободных P2-ек).
  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Я делал динамику f(i, mx, opened) -- максимальное количество раз, которое мы можем отнять P2, если мы отняли P1 ровно opened раз, максимальная сумма количества отниманий P1 и P2 для одной коробки равна mx, и всего мы обработали i коробок.


    Легко видеть, что если f(n, mx, opened) ≥ opened, а также mx ≤ opened, то ответ opened * (P1 + P2) возможен, иначе -- нет. Параметр mx нам нужен для того, чтобы мы не попытались отнять P1 и прибавить P2 к одной коробке за одно действие. Осталось заметить, что mx ≤ 40, причем если opened > 40, то нам уже не важно, чему равен mx. Значит, мы mx можем форсированно ставить 0 при opened > 40.

    Судя по резам на форуме, это проходит.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Кто как вторую решал?
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Переберем все маски размера 2n / 2. Динамика по длине маски и длине исходной строки.


    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Блин, вот я кривой. Оказывается моя динамика - не кубическая, а квадратичная. Надо было догадаться, что нафиг не нужно дополнительно хранить, где лежит задний из двух указателей на концы подпоследовательностей, которые мы уже набрали.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

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


      2 задачи, 2 ресабмита, 2 неудачных челленджа.

      Update: у Гены без двух последних оптимизаций проходит.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Надо еще отсечение сделать, чтобы кол-во x и o в маске совпадало. Тогда получается не 2n/2. А в худшем случае
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
        ← Rev. 3  
        Проголосовать: нравится 0 Проголосовать: не нравится

        я делала даже C(18, 9) — первый и последний фиксированы, отсечение по нулям в слое динамики и по кол-ву, как у Вас. На макстесте как-то быстро работало, надеюсь по wa не свалится — не особо проверяла свой код

        upd: ня, прошло

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

    Можно всунуть пересчитывание динамики в перебор маски так чтобы было 2n· n а не на n2. Работает 1,2 стабильно на 40.

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

    один я решал meet-in-the-middle?


    Разбиваем строку на две, в каждой части перебираем за 220 что отойдет в первую последовательность, что во вторую. Сохраняем состояния (len1, len2, mask), что означает, что в первая последовательность уже длиной len1, вторая длиной len2, а хвост длиной |len1 - len2| представимо маской mask. Перед тем, как сохранить это состояние нужно проверить, что у последовательностей равный префикс длиной min(len1, len2).

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

    Асимптотика 20 * 220 - очень быстро.
    Годится?
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Тоже так же решал, только изначально хранил не маску, а строки и это работало долго, когда на маски переписал стало норм.
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        делал все со строками, сравнивал, удалял, брал подстроки - работало локально 2.5 сек, я не рискнул заслать, пришлось переписывать на побыстрее.

        теперь локально работает 0.7 примерно
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Очень похоже на то, что выше описал dalex.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      И я так делал, на макстесте ~0.2c работает.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится +6 Проголосовать: не нравится

      Я делал тоже meet-in-the-middle. Достаточно заметить, что если в левой половине у нас маски (A, B) для синих и красных, а во второй (X, Y), то должно выполняться:

      A· 2n / 2 -  numberOfBlue  + X = B· 2n / 2 - numberOfRed + Y, что эквивалентно
      A· 2n / 2 -  numberOfBlue  - B· 2n / 2 -  numberOfRed  = Y - X.
      А значит, можно просто сохранить эти разности и каждый раз когда мы во второй половине получили разность, смотреть сколько таких же разностей было в первой половине.
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Вроде делал абсолютно также, но не зашло. Баг в реализации, или, может, есть какие-то тонкие моменты в таком решении?
        • »
          »
          »
          »
          »
          15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится +5 Проголосовать: не нравится
          А, да, точно. Я еще в маски разностей добавлял информацию о разности длин красных и синих посдедовательностей. Т.е. просто брал эту разность, умножал на 2 в большой степени и ксорил с тем что вышло. Потому что может выйти что длины последовательностей не совпадут.
          • »
            »
            »
            »
            »
            »
            15 лет назад, скрыть # ^ |
            ← Rev. 3  
            Проголосовать: нравится 0 Проголосовать: не нравится

            У меня был N/2+1 массив масок, в, к примеру, left[i] хранятся разности, у которых ровно i элементов принадлежат красной поcледовательности. Сливаю массивы left[i] и right[n/2 - i] для всех i. Вроде должно работать.

            UPD: Разобрался. Глупая ошибка в реализации - сравнивал Long между собой оператором ==, а не .equals(), как следует.

            UPD2: При том, что интересно, сэмплы проходили прекрасно, ибо для маленьких значений Long все объекты закэшированы, и прекрасно сравниваются через ==. Обидно.

            • »
              »
              »
              »
              »
              »
              »
              15 лет назад, скрыть # ^ |
               
              Проголосовать: нравится +5 Проголосовать: не нравится
              Странно, вроде бы багов не вижу. Но тест на котором упало не выглядит сильно тяжелым, особенно если убрать несколько крестиков с обоих концов, чтобы уменьшить его размер. Можно и подебажить :)
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Колян я точно также делал. Написал где-то на 300. Потом решил потестить в арене увидел что у меня не укладывается в памяти 81 метр вместо 64. Сделал 2 ресубмита в итоге печальный результат. А работало у меня очень быстро я очень нахаченно сразу написал
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
как можно решить С Div2 не перебором с отсечением по времени?
  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Я просто шагал с шагом 0.01 и считал максимальное количество для текущего времени.

  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Скорее всего тернарным поиском по времени =)
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится
    Переберем все возможные времена, при которых расстояние между некоторыми двумя москитами равно 2R. Место взрыва - средина между ними. Также учтем время T = 0. Вроде бы должно пройти. 
  • »
    »
    15 лет назад, скрыть # ^ |
    ← Rev. 3  
    Проголосовать: нравится +1 Проголосовать: не нравится

    Я решал так:


    Пусть [l,r] - отрезок, который накроет бомба. Попробуем рассмотреть каждую из точек в качестве левой границы. Теперь пробежимся по всем остальным точкам и определим момент времени, когда эта точка войдёт в этот отрезок и выйдет из него. Время входа и выхода толкаем в вектор, сохраняя флаг того, вход это или выход, после чего его сортируем. Идём по вектору и пользуемся принципом стека: когда встречаем момент времени, в который точка входит в отрезок, - увеличиваем счетчик, а когда выходит - уменьшаем. Тут требуется определённая эпсилон-кунг-фу, я не придумал как её избежать. максимум из всех значений счетчика и будет ответом. асимптотика - O(n2*logN)

    UPD. Упало. Эпсилон-магия мне неподвластна =(
    UPD2. Тупая бага с целочисленным делением. стыдно. Но в целом решение верно.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится +3 Проголосовать: не нравится

      >   Тут требуется определённая эпсилон-кунг-фу, я не придумал как её избежать.

      Избежать очень просто: хранить вместо double два int'а - числитель и знаменатель.

      Кроме того, кажется, что можно просто из левых концов всех отрезков повычитать эпсилон.
  • »
    »
    15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Записываем моменты времени, когда 2 москита стоят в одной точке.
    Так как все скорости разные, считались такие точки очень просто.
    Добавляем момент времени 0, и для каждого момента считаем сколько максимально москитов находятся на отрезке длиной 2R.
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      В точности такое же решение у меня не прошло один из финальных тестов... Там видимо нужно было шаманство с эпсилонами?
    • »
      »
      »
      15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      и это решение прошло систесты? - оно же не правильное, или я чего-то не понимаю...
      • »
        »
        »
        »
        15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Ну не знаю.
        Сам не ожидал.
        Сел писать первое решение, пришедшее в голову, так как инет отрубился где-то на 30той минуте, потом созванивался с провайдером, ...
        Прошло все тесты.
        Можете посмотреть код тут: http://pastebin.com/9RYSsr25

        • »
          »
          »
          »
          »
          15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится 0 Проголосовать: не нравится
          Ну, интуитивно кажется вроде бы, что идея решения как раз верная.

          P.S. Епсилон таки присутствует. Абсолютно такой же код без него получает Failed System Tests. Ну когда же я научусь в правильные места эти эпсилоны засовывать... =(
          • »
            »
            »
            »
            »
            »
            15 лет назад, скрыть # ^ |
             
            Проголосовать: нравится 0 Проголосовать: не нравится
            После нескольких контестов, где я сравнивал даблы без епсилона и нескольких не очень ласковых поглаживаний моей головы руками напарников, уже не забываю писать нормальное сравнение)

          • »
            »
            »
            »
            »
            »
            15 лет назад, скрыть # ^ |
             
            Проголосовать: нравится 0 Проголосовать: не нравится
            А ты проверял в момент времени 0?
            • »
              »
              »
              »
              »
              »
              »
              15 лет назад, скрыть # ^ |
               
              Проголосовать: нравится 0 Проголосовать: не нравится
              Да, без этой проверки он бы даже один из стандартных не проходил (там где в разные стороны движутся два москита).
          • »
            »
            »
            »
            »
            »
            15 лет назад, скрыть # ^ |
             
            Проголосовать: нравится +1 Проголосовать: не нравится
            a < b   ->   a < b-eps
            a <= b   ->   a < b+eps
            a == b   ->   abs(a-b) < eps
            a >= b   ->   a+eps > b
            a > b   ->   a-eps > b

            Главное - считаем, что числа равны, если abs(a-b)<eps. Если есть сомнения, надо на бумажке нарисовать, станет все ясно.
            • »
              »
              »
              »
              »
              »
              »
              15 лет назад, скрыть # ^ |
               
              Проголосовать: нравится 0 Проголосовать: не нравится
              хм, спасибо. Сейчас вроде стало понятнее откуда берутся эпсилоны в сравнениях и с каким знаком их нужно ставить. Надеюсь, этот SRM послужит мне уроком =)
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
когда систесты закончатся?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
В арену только у меня не логинится?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
А каким образом сдают 250p задачу на 250 поинтов? И вообще любую другую на полное кол-во баллов?
Читы вроде чтения задачи с одного акка?
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +55 Проголосовать: не нравится
Может из-за того что близится Новый Год всё так, но хочу сказать что последние раунды на кф проходят гораздо лучше чем на тс... нет задержек, тестируется по окончанию... рекомендую кф табличку со словом "beta" подарить тс, может она им понадобиться...
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +12 Проголосовать: не нравится
Найс. +100, теперь красный.
»
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
Прощай, второй дивизион! =)
»
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится +5 Проголосовать: не нравится

Ура! После 99-го своего SRMa я стал наконец-то красным!!!

»
15 лет назад, скрыть # |
 
Проголосовать: нравится +13 Проголосовать: не нравится
Бывают SRM-ы, за которые мне очень стыдно.