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

Автор aropan, 13 лет назад, По-русски
  • Проголосовать: нравится
  • +23
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится
Очень понравилось, хорошее качество, много ad hoc задач, и сервер не валился, как обычно.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А как в E просто количество ходов посчитать?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    примерно так
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится
    Если |x1-x2| = |y1-y2|, то эта позиция проигрышная для первого иначе для второго. Т.е. чтобы победить надо после своего хода образовывать квадрат, это можно сделать двумя способами, но оптимальных из них будет один (оставляю как можно меньше пространства второму игроку), т.е. стратегия для победителя однозначная. Стратегия для проигравшего -- как можно больше оставить простор для себя, то есть по возможности приближаться, если нет, то отдаляться. Если приблизиться на несколько клеток, то и простор будет быстро кончаться, поэтому все ходы приближения/отдаления будут на соседние клетки. А там уже считается.
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится
      Совсем не так решали эту задачу. Решим сначала такую задачу: кто выигрывает и за сколько ходов, если у нас есть доска n*m и ладьи стоят в противоположных углах. Это мы решали динамикой d[i][j]. Тогда пересчет не очень сложный - ведь из состояния d[i][j] можно попасть в состояния d[2][j], d[3][j], ..., d[i-1][j], и d[i][2], d[i][3], ..., d[i][j-1]. Тогда сразу можем определить кто выигрывает для такой доски. А если мы хотим найти число ходов, то тогда надо заметить следующий факт. Что если у нас есть доска N*M и наши ладьи находятся в углах какой-то ее поддоски n*m, то ответом будем число d[n][m]+x. Где x - это удвоенное манхэттенское расстояние от ладьи проигрывающего игрока до угла доски N*M (такой угол ровно один). После этого легко пересчитывать динамику и легко решить исходную задачу - ведь выигрывающий игрок зависит от числа d[n][m], а количество ходов находим по приведенной формуле. Все это иллюстрирует следующая картинка:

      На картинке стрелочками изображено расстояние, которое нужно удвоить и добавить к ответу. Красный кружочек - это ладья человека. В данном случае это расстояние отмеченное стрелочками равно 3 и тогда x=6. Стрелки направлены именно в таком направлении, так как для такой игры человек проигрывает - это следует из того, что d[4][4]=8. Итого d[4][4]=8, поэтому общий ответ - это 8+2*3=14.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Почему совсем не так? Просто вы считали динамикой то, что можно было вычислить за О(1).
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну возможно похоже, но в процессе решения даже не возникло мыслей насчет того, что выигрышность позиции зависит от истинности выражения |x1-x2| = |y1-y2|. Поэтому мне показалось, что это совсем разные идеи :)
    • 13 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      Образовать квадрат можно, вообще говоря, двумя способами. Другое дело, что правильная стратегия - образовывать квадрат с наименьшей стороной.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А мне интересно, как в H ловить разницу между "три точки на одной прямой" и "три точки почти на одной прямой", если там координаты до миллиарда. Мы, сравнивая углы, умножали расстояние по одной координате на полное расстояние - думаю, если вместо этого делить, всё равно ничего не получится. 18 знаков double держит плохо. Попытался написать "#define double long double" - никаких изменений почему-то.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Можно было написать в целых числах.
    • 13 лет назад, # ^ |
        Проголосовать: нравится -22 Проголосовать: не нравится
      С квадратами расстояний? И длинную арифметику ещё типа?
      • 13 лет назад, # ^ |
          Проголосовать: нравится +16 Проголосовать: не нравится
        Векторным произведением
        • 13 лет назад, # ^ |
            Проголосовать: нравится -9 Проголосовать: не нравится
          ВНЕЗАПНО. Никогда так не делал. Мда, век живи - век учись...
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Не знаю, с этим проблем не было, но почему не хватает:
        (x2-x1)*(y3-y1)==(x3-x1)*(y2-y1) т.е. максимальное значение 4*10^18?
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Именно, аккурат в long long влезает, я правда только на дорешивании сдал :(
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Там все влезает в long'и
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересно решение задачи K.
И как можно было быстро решить А? Я решал так: 2-мя бинпоисками находил отрезок минимальной высоты и длины, в который влезает и a и b. Далее сокращал высоту, переходом a в ярус, в котором сидит b. И снова находил границы, и так пока a и b не станут равны.
  • 13 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится
    Задача А - переводим оба числа в их двоичное представление (предварительно отняв по единице). Дальше бежим со старших разрядов, если цифры в числах не совпадают - меняем все цифры на противоположные в любом из двоичных представлений. Количество таких изменений есть ответ.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Спасибо. Я понял самый первый вариант, так что мог не исправлять :) Я тоже рассматривал решения с переводом в двоичную систему, но до такого что-то не допер.
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      Только поясню почему именно так: если представить наши числа как бинарные строки (спускаясь от корня к переулку, если влево то 0, иначе 1), то операция зеркального отражения будет эквивалента инвертированию любого суффикса в строке...
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится
    Главное наблюдение в задаче K следующее.

    Пусть у нас есть 2n команд с рейтингами L1, L2, ..., L2n, причём L< L< ...< L2n (никаких регионов пока нет!). Тогда разбиение этих команд на пары будет оптимальным, если каждая команда среди первых n попадает в пару с одной из последних n команд. Общее число таких разбиений, следовательно, равно n!

    Таким образом, легко понять, во-первых, существует ли разбиения с учётом географической специфики, во-вторых, существует ли разбиение с номером K. Само же разбинение, если оно существует, получить уже просто.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ты не учитываешь "...каждая пара разбиения должна состоять из команд одного региона...", т.е. порядковый номер числа в исходном массиве выбранного из первых n чисел должен иметь такую же четность как порядковый номер числа выбранного из последних n чисел. В связи с этим общее количество вариантов будет не n!, а (n/2)!^2.
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится
        Я говорил об основном наблюдении, в упрощённой формулировке. Формулировку уточнил, спасибо.

        Если n - это то самое n, которое в условии задачи, то количество оптимальных пар с учётом региона равно или (n / 4)!^2, или нулю.
      • 13 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
        все еще очень упрощается тем, что все номера будут различны попарно.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Нельзя разбить на две группы по четности (по крайней мере я себе это не представляю), потому как порядок следование чисел в нашем конечном списке заранее не определен.
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      Можно по-подробнее, почему    разбиение будет оптимальным, только если пары будут образованы м/у элементами правой части массива и левой(по n шт)
      а именно при исходном массиве 1 2 2 2 2 2 2 3
      чем не оптимально разбиение  7 4 5 2 3 8 1 6 // спасибо )
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Во-первых, в этом массиве почему-то девять элементов. Во-вторых, все рейтинги должны быть различными. 
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Поробую объяснить.

        Давай определим сначала значение нашего максимальноего значение. Понятно что это делается жадно беря самое минимальное и самое максимальное число в пару. Т.е. если я отсортирую свой список, то пару будут (1,N), (2,N-1) ... (N/2, N/2+1). Как видим изначально для каждого из первой половины сопоставлено число из второй.
        Теперь давай рассмотрим две пары (a,b) (c,d). Понятно что c < b, так как если это не выполняется, то я могу улучшить ответ сделав пары (a, c) (b,d) /* ответ в данном случае улучшиться на 2*(L[c] - L[b]) */ (тоже самое можно сказать про a < d). Такую пару пар я могу превратить в другую пару не потеряв в сумме ничего. (a,b) (c,d) и (a,d) (c,b) эквивалентны, то есть в общую сумму добавляют одинаково. Таким образом между любыми двумя парами я могу обменивать второй элемент, т.е. для каждой из первой половины выбрать любого из второй. 
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А правда ли, что J решалась потоком?
И если да, к какому потоку сводилась задача?
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится
    Она решалась максимальный поток минимальной стоимости.

    Чуть позже здесь будет краткий разбор.
    • 13 лет назад, # ^ |
        Проголосовать: нравится +10 Проголосовать: не нравится

      Я разберу :-)

      1. Проведём дуги из истока к помещениям (cap = ti, cost = 0).

      2. Проведём дуги из помещений в вершины-ограничители (cap = wi, cost = 0).

      3. Проведём дуги из помещений и вершин ограничителей в вершины-минуты (cap = 1, cost = число_людей_в_эту_минуту_в_этом_помещении). Само собой, что дуги из помещения проводятся в минуты только если нет ограничений в эту минуту, иначе - проводятся из ограничений.

      4. Проведём дуги из минут к стоку (cap = 1, cost = 0).

      Поток не может быть больше чем 500 (рабочий день уборщика). Поэтому итоговая ассимптотика - O(500 * E log V) - если посчитаешь максимальное число вершин и рёбер, в ограничения попадает легко.

      Остаётся только узнать, получился ли поток максимальным и аккуратно восстановить решение.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Если несложно, можно для тех, кто в танке: что такое OpenCup, кто (и как) его проводит и где читать правила? Забанили в гугле.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится
    ВНЕЗАПНО opencup.ru :)
    Или что-то оттуда неясно?)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Собственно, неясно, кто проводит. Логотип Яндекса в углу что-то символизирует? :)
      И какова роль координатора региона (кроме раздачи паролей): подразумевается очное написание контестов?
      • 13 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        Внезапно пункт 5.1 и 5.1.1.
      • 13 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится -8 Проголосовать: не нравится
        Отвечу тогда про "кто проводит". Каждый этап в основном проводится на задачах какого-то локального онсайт-контеста, то есть проводят совместно авторы задач и собственно Snark, также известный под именем Олег Богданович Христенко, из МГУ (вот не знаю, кстати, а есть ли у него с этим сайтом вообще хоть кто-нибудь в помощниках?). Логотип "Яндекса" же символизирует, что сия компания время от времени спонсирует серии маленьких личных контестов, проводящихся на том же сайте, и по их результатам раздаёт каких-то фирменных слонов слоников.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Логотип Яндекса на Опенкапе потому, что Яндекс — спонсор Опенкапа. В правилах можно прочесть также, что 1-10 места приглашаются на очный раунд, а там бывают ценные призы победителям.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Кто как решал задачу F?

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

Как можно было лучше решить?

  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Видимо, это любимая классическая задача новичков :) Всё та же конденсация по сильно связным компонентам.

    P.S. Так и что, с Вашим удалением вершин прошло всё ж таки?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, проходит, но много кода. Я смотрю, народ за 10 минут делал))
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Много? Ну, в моей реализации 65 строк, считая закомментированный дебажный вывод, - это намного меньше? Всё-таки крайне интересно, а как это Вы так хитро удаляли вершины? У меня почему-то было предубеждение, что такого рода решение неизбежно квадратично.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Не могу так сразу сказать алгоритмическую сложность...

          Вот код, можете посмотреть http://pastie.org/1723488

          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ничего не понял, но на первый взгляд квадрат на логарифм. Видимо, на самом деле что-то как-то клёво амортизируется.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

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

              Потом выводится количество ребер в графе из сильных компонент связности.

              А можете показать как выглядит код короткого решения?

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Количество рёбер между разными сильными компонентами связанности.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Не знаю номер задачи. Писали контест в Таганроге.
Задача про братьев и землянику.
Зашло у кого-нибудь решение за O(N*M*N*M) на опенкапе?
У меня на онсайте где-то в 1,6-2 раза не укладывалось по времени.
Глупо, конечно, было думать в таком направлении.
Мне как сказали, что там сложность O(N*M*log K), я сразу-же придумал.
Но все-таки если у кого-то зашло, то обидно.
Я уже мог где-то в 3:20 - 3:30 отсабмитить и в самом этапе опенкапа мы заняли бы 3-е или 4-е место, а так только 7-е.

P.S. Я бы и сам проверил именно свое решение, но дорешивание лежит. :)

UPD. Уже заработало. Отправил. Не прошло. Так что никаких шансов на место повыше не было. :)
Но вопрос все равно актуален. Было бы интересно, если кто-нибудь таки запихал такое решение.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Это задача I. Вообще ivan.popelyshev на неё писал перекрестное - поиск суммы в ромбах за O(N*M), а вот поиск минимума по краю ромба он с константой искал.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    У нас за O(N*M*logK).