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

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

Good news everyone!

9 мая (всех с праздником!) в 5 утра по Москве, наше любимое время, состоится очередной SRM

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

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

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

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

Они б ещё 22 июня в 4 утра сделали

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

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

Как решать Div1.Medium ?

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

    динамика. Состояние — текущая маска и сколько мы уже букв проверили. Переход — надо пойти по всем позициям, которые уменьшают маску + (количество всех, которые маску не меняют — сколько уже проверили) раз пойти в текущую маску

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

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

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

        это не работает на сэмплах

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

          Если делить на нужный коефициент то семплы проходит.

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

            Даешь подбор констант!

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

              (1-k/длина слова) где к — количество переходов из маски в саму себя. Очевидно откуда он берется.

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

        Верно, видимо. Но в 5 утра я до этого не допер

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

Как можно было догадаться до формулы в 250? >_<

P.s. идея решать в 5 утра была очень неправильной.

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

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

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

      Ну я имею ввиду формулу в простом решении за квадрат. В упор не понимаю, откуда оно берётся.

      UPD. Осознал. Мозг отказывался посчитать способы, которыми точки можно засунуть в прямоугольник.

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

        Не очень понимаю, где там именно нечто, которое можно назвать формулой, но может поможет:

        Сумма расстояний зависит только от расстояния между правой и левой вершинами и верхней и нижней.

        Посчитали для каждого расстояния кол-во способов его получить. Далее для пары (расст. по X, расст. по Y), если время суммарное в [min, max] добавляем к ответу кол-во способв выбрать третью X и третью Y координату. Ну и умножаем на 6 — кол-во способв расставить 3 ладей в квадрате 3x3

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

        рассмотрим все 6 вариантов упорядочивания точек по y. для 4х из них фигура обхода — это прямоугольник, для которого ответ (a-1)*(b-1), a,b — стороны прямоугольника. Для остальных двух вариантов, где точки строго убывают/возрастают, фигура тоже сводится к прямоугольнику, и в нём тоже ответ (a-1)*(b-1). Ещё нужно учесть все варианты расположения этого прямоугольника, т.е. (X-a)*(Y-b). И того формула res += (a-1)*(b-1)*6*(X-a)*(Y-b). Если вы конечно об этой формуле :)

        кстати, как оказалось 32 миллиона взятий модуля для Java это много...

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

          Откуда 32 миллиона?
          П.С. Ответ можно в считать в лонгах и только в конце взять по модулю.

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

            ну я начал писать через f(maxT)-f(minT-1). f(t) — это 4000*4000. и ещё дважды. понятно, что можно написать и 4000*4000 на итах, или без модулей, но всё равно обидно.

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

        Посмотрим на прямоугольник AxB, отметим в нём три строки(первую, последнюю и I-ую[0<I<A]) и три столбца(первый, последний и J-ый[0<J<B]). Таких прямоугольников (A-2)  ×  (B-2).
        Такие прямоугольники можно расположить (X-A+1)  ×  (Y-B+1) способами, при этом в них будет маршрут длины ровно (A+B-1)  ×  2. Теперь переберёмся по всем A и В и посуммируем ответ.
        Ещё нужно не забыть умножить на 3!

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

          Да, мы хотим посчитать каждый треугольник единожды.

          Я вот на контесте фиксировал только два крайних столбца и считал что формула, (X-A+1)*(Y-B+1)*(B-2)*6. Я знал что формула должна быть симметричной и что ответ где то рядом.

          Но когда увидел что осталось 7 мин. мой мозг буквально отключился...

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

Расскажите, пожалуйста хард :)

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

    Единственное непалевное решение вроде у dzhulgakov, там видно, что бинарный по ответу + поток. Понять я его пока не могу

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

      Я такое накодил, но допустил тупой баг и оно не проходило семплы :( Там задача сводится к hard life с NEERC 2006.

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

        Можешь рассказать, как сводить?

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

          Сейчас, если пройдет в практис руме.

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

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

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

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

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

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

              Теперь немного о решении. Есть замечательный алгоритм Гольдберга для поиска подграфа с максимальной средней степенью: http://www.eecs.berkeley.edu/Pubs/TechRpts/1984/CSD-84-171.pdf В нем мы максимизируем sum(edges)/K, в нашем же случае в знаменателе стоит квадратичная функция. Однако оказывается, что такое же решение можно применить и в данном случае.

              Будем делать бинпоиск по ответу. Пусть мы хотим проверить значение g. Тогда мы хотим проверить неравенство

              sum(a_ij, i,j \in V1) / 2*(K*(200 - K)) < g
              

              если умножить на знаменатель и перегрупировать получаем

              sum(a_ij, i,j \in V1) < 398*g*K + K*(K-1)*2*g
              

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

              sum(a_ij + 2*g, i,j \in V1) < 398*g*K
              

              ну а дальше осталось применить алгоритм Гольберга, т.е. построить подходящий граф и пустить в нем поток. Если минимальный разрез содержит больше 1 вершины в левой доле, то идем в одну сторону в бинпоиске, иначе — в другую. Конкретные веса ребер можно посмотреть у меня в решении или в оригинальной статье.

              Собственно я долго выводил эти выражения, где-то ошибся и в итоге 10 минут подбирал коэффициенты, чтобы прошло тесты :) К сожалению я упустил момент с точностью, буквально исправление одной строки делает решение правильным. Также я не успел написать нормальный поток, так что мое решение проходит в практисе за 1.8 секунды.

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

              У меня было неправильно сведение, но Дима рассказал как надо правильно избавляться от квадратов в знаменателе. Идея следующая: пусть мы хотим проверить, превышает ли наш ответ X или нет. То есть, нам надо узнать, существует ли такой набор из k вершин с суммой весов ребер sum, что sum / (200k - k2) ≥ X.

              это эквивалентно sum + k2X ≥ 200Xk

              Всего суммарная степень в подграфе (k2 - k) / 2. Назначим ребрам новые веса: newcostij = costij + 2X. Тогда 2sum + k2X = newsum + 2kX. То есть, нам надо проверить newsum - 398Xk ≥ 0.

              Получили задачу: проверить, существует ли в графе с новыми весами подграф, у которого средний вес ребра не меньше 199X. Это уже задача HardLife. Как ее решать, можно почитать здесь.

              UPD: Дима сам меня опередил. Правда, у меня оно сдалось только после некоторых плясок с бубном вокруг эпсилона.

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

На чем челленджили 500?

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

    А, ну там вроде у некоторых мапы были.

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

    я почелленжил экспоненциальное решение в своей комнате, но это было тривиал =)