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

Автор mkagenius, 14 лет назад, По-английски
Теги tco
  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

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

If you allready qualified — do not forget about parallel rated round

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

Is site loading for anyone? Or arena? I can't even register:(

UPD: Починили

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

Registration is prolonged by 10 minutes because of connection problems

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

Автор 300-ки (особенно автор формата входных данных), убейся.

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

    Формат тот еще, да, но задача вполне номальная.

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

    Насколько я понимаю, они не поддерживают vector<vector >, поэтому приходится так издеваться. Не первый раз такое, думаю, надо отнестись с пониманием. (Что-то верстка захавывает int).

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

      В какой-то мере объясняет, но вызывает сразу два других вопроса.

      А почему у них не поддерживается вектор векторов? (впрочем, способ задания входных данных в арене уже почти причина...)

      А почему нельзя дать формат, когда каждый вектор интов представляется стрингом (последовательности цифр, разделённые запятыми/пробелами/ещё чем-нибудь)?

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

        А почему нельзя дать формат, когда каждый вектор интов представляется стрингом (последовательности цифр, разделённые запятыми/пробелами/ещё чем-нибудь)?

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

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

          Один раз видел, когда действительно данные разделялись запятыми, т.е. формат был примерно такой: "Дан вектор строк, соедините все строки в одну, получите строчку, содержащую входные данные, разделенные запятыми". Не сказал бы, что это проще для реализации. Но тут плюс в плане наглядности.

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

У меня одного челлендж-фаза не началась?

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

Кто может сказать, какую дорогу и как надо изменить в 300-ке в Sample 7 (последний)?

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

Есть идеи что не так в 900? Насколько я понял условие "одновременности", что если одна команда кинула землю на сектор в один день, то другая команда нам том секторе может эту же землю поднять и перекинуть, но так даже семплы не совпадают)

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

Как решать 500 и 900? Вроде у всех достаточно простые с виду решения, а в голову только какой-то треш со структурами данных (в 500) лезет.

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

    Аналогично, сидел прикручивал какие-то структуры, но ничего толкового не вышло

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

    500: посчитаем сначала количество треугольников вида x[r] < x[g] < x[b], y[r] < y[b] < y[g] и x[r] < x[g] < x[b], y[r] < y[g] < y[b] в сумме. Это можно сделать, если отсортируем все точки по x, сожмем координаты по y, потом будем перебирать x[r] и поддерживать сумматор, отвечающий на запрос, сколько точек с координатами l <= y <= r. Если текущая точка (x[r], y[r]), то при c = sum(y[r] + 1, MAXY) к ответу нужно прибавить c * (c — 1) / 2. Далее из сумматора удалить точку y[r] и перейти к следующему x. Вот, а теперь из ответа нужно вычесть кол-во треугольников x[r] < x[g] < x[b], y[r] < y[g] < y[b] — т.е. кол-во 3-инверсий. Это известная задача, можно тем же сумматором посчитать.

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

    500 — сожмем координаты, посортим точки по x. заведем 2 дерева отрезков с суммой, в первое из них положим все точки.

    теперь идем снизу вверх (по x) и поддерживаем наши деревья отрезков так, чтобы в 1м были все точки выше, а вот 2м — все ниже (ну просто "перекладываем" из 1го дерева во 2е). и в процессе считаем 2 величины:

    1. количество "любых" треугольников с углом в красной вершине
      x(r) < x(g) < x(b) && ( y(r) < y(g) < y(b) || y(r) < y(b) < y(g) )
      это T1.get(y_i, n) * (T1.get(y_i, n)-1) / 2;

    2. количество треугольников где точки "на одной прямой"
      x(r) < x(g) < x(b) && y(r) < y(g) < y(b)
      это T2.get(1,y_i) * T1.get(y_i, n)

    ну и в конце просто вычитаем 2е из 1го

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

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

    Нужно понять, что нам надо посчитать количество всех возможных хороших треугольников, которое равно количеству всех треугольников минус количество плохих. А плохие бывают всего двух видов — когда у трёх точек монотонно увеличиваются сразу две координаты, и когда одна монотонно увеличивается, а другая уменьшается. Первый случай решается с использованием метода динамического программирования за O(N*logN), а второй — аналогично, только с инверсией одной координаты.

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

На контесте не дописал решение по 300-ке за O(N4). А можно было (как-нибудь не слишком адово) писать за более быструю асимптотику писать?

P.S. Чужие решения смотреть не хочу до отправки в практис рум.

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

    Многие (в т.ч. я) писали вообще за O(N5). Мне кажется, теоретически можно за куб, если заранее найти все рёбра, по которым возможен переход, но это уже много возни.

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

    Я не знаю решения быстрее, чем за 5ю степень

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

      Я не уверен в правильности своего решения, но в нём чистая четвёртая степень.

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

      Когда мы моделируем процесс движения торговца, на каждом шаге приходится искать минимум из всех рёбер. Т.к. перед каждым моделированием менялось лишь одно ребро, то все минимумы можно не пересчитывать, а только один. Получается O(N4). Или я что-то не понимаю?

      UPD: это неправда.

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

        Да, наверное. Но так как ограничение всего 30 я особо не парился

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

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

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

      У меня вроде бы за четвертую. Просто жадно когда решаем куда-то пойти ставим вес ребра. Всего, понятно, n^2 ребер, строим путь за квадрат

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

        Можно чуть подробнее? Куда ставим?

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

          Пишем рекурсивную функцию, которая помечает пройденные вершины, храним флаг — меняли ли уже какое-то ребро или нет.

          Если уже меняли какое-то ребро, то в текущей вершине находим первую неиспользованную по весу (естественно, изначально для каждой вершины посортировали массивы исходящих рёбер по стоимости ребра).

          Если не меняли, опять же можем взять первую неиспользованную вершину, при этом считаем что вес ребра не меняли. Второй вариант: можем поменять вес ребра. Рассмотрим множество непомеченных вершин из текущей, отсорченных по возрастанию весов. Есть три варианта:

          • идем в первую вершину, тогда максимально увеличиваем её вес, чтобы она все ещё была первой в списке (формулка),

          • идем во вторую вершину, тогда максимально увеличиваем первую, чтобы можно было пойти во вторую (упс, еще если не получится, надо уменьшить вторую, минимально, чтобы она стала первой в списке),

          • идем в какую-то другую вершину — по любому должны установить вес ребра в вес ребра, идущего в первую вершину списка, +/-1.

          Устанавливаем флаг измененного ребра, запускаем рекурсию

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

      Да, зашло решение за четвертую.

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

Контест куда-то пропал из Active Contests.

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

Как отлично — теперь арена еще и падает :)

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

Кто-то может по такому поводу обьяснить как футболки распределяются? Вот из правил выдержка "The Algorithm Competition will award T-shirts to the 350 Competitors with highest Ranks, where a Rank of a competitor is defined as the best taken place out of all Online Rounds of Online Stage 2 in which this Competitor achieved a score greater than zero." Если я правильно понял, то достаточно один раз попасть в топ 350. С другой стороны в чате арены говорят, что даётся всем, кто примерно топ-117 из каждого раунда.

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

По моим подсчётам футболки получают первые 137 в каждом раунде.

3й раунд уже из статистики — проходной порог не изменился.

Скачать .xlsx

Скачать .csv

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

    Спасибо за хорошие новости. Не думал, что 112 места будет достаточно. В этом году как-то не получалось у меня с футболками, я даже второй раунд GCJ умудрился проспать, а тут за один день обеспечил себе футболки RCC и TCO.