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

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

Good news everyone!

Так как предыдущая тема съехала из прямого эфира придется заводить новую

Сегодня в 19:10 по Москве состоится очередной СРМ

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

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

Так как предыдущая тема съехала из прямого эфира придется заводить новую

Но ведь можно было просто поднять старую.

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

Правда, что в медиуме достаточно было предпосчитать вектора вида (x,y) 0<x<=L, 0<y<=H, gcd(x,y)=1, а потом для каждой стартовой вершины перебрать?

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

    Врядли. Их порядка (HL)/2 казалось бы.

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

    Ну, я не так делал — я фиксировал вектор до последней взятой точки

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

    Да, потому что получится асимптотика не N^3, а N^2 log N, так как вылезет какая-то сумма по всем n (1 + 1/2 + 1/3 + ... + 1/n).

    UPD: А, стоп. Конечно не перебрать из каждой стартовой вершины. Для фиксированного вектора (x, y) мы умеем за O(min(L / x, H / y)) рассовывать из него всё, на что он влияет. И тогда получится N^2 log N

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

      Вроде бы даже N^2, потому что сумма обратных квадратов.

      Но для каждой перебираемой пары придется считать gcd, то есть все-таки N^2 log N.

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

        Ну не квадратов всё-таки. Сумма по .

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

          Ах да, я просто считал количество прямых с не меньше, чем k точек на них, и для k есть (N/k) вариантов по dx и (N/k) вариантов по dy, а количество хороших стартовых позиций легко по k и dx вычисляется.

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

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

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

        Не-а. Если вектор (x, y) со взаимно простыми координатами, то он принципиально бывает интересен в d = 1 + min(L / x, H / y) состояниях: когда на нём 1 точка, 2, ... d. Для каждого состояния мы положениям вектора на отрезке оно соответствует и прибавляем к коэффициенту при нужном биномиальном коэффициенте. Получается O(d) на вектор.

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

      А почему O(L / x + H / y) а не O(L / x)? Вроде как более сильная оценка неверна только если x = 0 и положить L / x = ∞ =)

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

        Ну, в выражении выше я на автомате шлёпнул O(L / x + H / y), хотя там более корректно O(min(L / x, H / y)), сейчас поправлю.

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

          Нет, я не об этом. По мне, так второе слагаемое/аргумент функции min можно опустить, если не брать в расчет случай x = 0.

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

            А, в смысле, так тоже выйдет правильная оценка? Ну да, а так сразу видно, почему оно летает — во-первых, из минимума возьмётся коэффициент 1/4, из того, что вектора со взаимно простыми координатами — ещё 6 / π2...

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

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

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

    бред

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

Авторы молодцы, замечательные условия! Всегда бы так.

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

Как решать 975?

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

    Ну, во-первых, эти 2 энда равны энду всех чисел. Вычтем этот энд из всех чисел, тогда нам надо разбить на 2, энд которых 0. Будем решать рекурсивно по битам. Посмотрим сколько у нас в данном бите нулей. Если их меньше 2х, то ответ, очевидно, 0. Если больше, то сначала просто вызовем для i — 1 бита, убрав i-й. Какие варианты мы посчитали, хотя не должны были? Ровно те, где все нулевые биты лежат внутри одного цвета. Тогда поэндаем все числа с нулевым битом, добавим получившееся число к массиву из тех, к которых в i-м бите единица (убрав этот бит), вызовем рекурсию и вычтем результат из ответа.

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

задачи отличные, особенно мне понравилась 500

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

Я определённо тупой, но как решать 250?

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

    Для каждой позиции(с 1) перебираем символ, берем наименьший подходящий.

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

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

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

    Не один такой :)

    Видел какие-то адские dfs'ы, но ломать побоялся. Ещё в комнате были совсем коротенькие решения (пара циклов), но какие-то они подозрительно простые.

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

Кстати, раз уж автор темы — Егор, несколько пожеланий по плагину:

1) Почему он импортит все функции с данным именем, а не только нужную? Если есть много перегруженных функций, то так можно случайно нарушить UCR. Это реально поправить, и будет ли это правиться в ближайшее время? :)

2) В окошке тестов очень не хватает hotkey-ев — без них на компе без мыши дебагать очень сложно.

3) В случае успешного прохождения тестов пишется, что они пройдены успешно, но таблички с временем по каждому тесту нет (а она была бы полезна, особенно учитывая, что это java, а не c++)

А вообще — замечательный плагин, с ним писать очень удобно. Спасибо за его разработку :)

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится
    1. Он импортирует все, а потом удаляет неиспользуемое. Должен по идее удалять перегруженные (но не переопределнные) с тем же именем (если только это не имя самой целевой функции для TopCoder или не main для обычных тасок)

    2. Надо будет стырить где-нибудь приличный редактор текстовый.

    3. Показывается максимальное время (а не сумма, как можно было бы подумать). Не уверен, что нужно прям по каждому тесту

    Кстати, проект опенсорс, шлите полезные патчи. У меня на этот проект есть лицензия на Idea от JetBrains, кто будет контрибутить — поделюсь. Сам я в последнее время был занят очень, но постараюсь сделать то, что уже запланировал

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

      По поводу п.1 — он не удалил импортированные gcd(int, int) и gcd(long, long), а также pow(int, int, int) и pow(long, long, long). При этом в первом случае idea почему-то не понимает, что gcd(long, long) unused, но для pow понимает. Надо будет подробнее посмотреть.

      Будет время — постараюсь что-нибудь поcotribютить.

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

проходило ли в 275 дп за O(n2 * 2n)?

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

    Смотря какая динамика. Я, по своей глупости, написал динамику за O(n * 2n), а не простое решение. Есть гипотеза, что у вас такое же — откуда взялся квадрат в оценке?

    UPD. Прошло

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

      Объясни, плз, как ты считал динамику в этой задаче?

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

        dp[mask][f] — наибольшее количество инверсий, которое можно сделать буквами из множества mask, f — нужно ли, чтобы при этом строчка была не меньше оставшихся символов в minStr.

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

          Хотите прикол. Ответ на такую динамику будет cnt*(cnt-1)/2. где cnt свободные элементы в маске. Так что это по сути жадный, но вы этого не подозреваете.

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

            Во-первых, cnt * (cnt - 1) / 2 будет только в том случае, когда оставшиеся символы, расположенные в порядке убывания, не меньше остатка строки, если мы до этого все время выбирали ее префикс. Во-вторых, все в курсе. Бывает, что во время контеста начинаешь писать первое, что пришло в голову и проходит по времени, не подумав о более легких решениях.

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

        у меня было d[mask][eq] — максимальное число инверсий, которые можно получить буквами из множества mask, eq — равен ли построенный уже префикс префиксу строки minStr. при этом в дп мы следим, чтобы наша строка всега была не меньше minStr, для этого собственно и нужен второй параметр.

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

А арена сейчас только у меня не работает?