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

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

Задача А.

В этой задаче нужно было лишь удостовериться, что ∑xi  = 0, ∑yi  = 0 и ∑zi  = 0.

Явно это условие не писали, чтобы у участников была возможность для взломов.

 

Задача B.

В этой задаче, фактически, требовалось найти победителя на каждом этапе. Для каждого участка это делается полным перебором всех участников для нахождения участника с минимальным временем прохождения участка, который бежал этот участок. Асимптотика решения O(nm).

 

Задача C.

В этой задаче требовалось после каждой покупки обновлять набор артефактов у всех друзей Кости. Нужно завести матрицу c[i][j] – количество j-ого базового артефакта, требуемого для того, чтобы собрать i-ый составной артефакт. Далее можно было завести матрицу составных артефактов, где a[i][j] – количество j-ого базового артефакта у i-ого друга и аналогичную матрицу b составных артефактов, и после каждой покупки  i-ого друга проверять собрался ли у него какой-нибудь составной артефакт за O(MN). Для этого нужно проверять собрался ли один составной артефакт за O(N). Это делается следующим образом: для i-ого друга нужно проверить, существует ли u, что c[j][u] > a[i][u]: если да, то j-й артефакт не будет собран, если нет, то нужно увеличить b[i][j] и обновить значения в a[i]). То есть асимптотика обработки всех покупок O(NQM). Далее требуется для каждого человека составить список артефактов, храня при этом их количество(суммарно O(KN + KM), которые у него есть, и отсортировать его (суммарно O(QlogQ)).

 

Задача D.

Данная игра конечна, так как за исключением конечного количества(2) отражений относительно прямой y=x, координаты изменяются на неотрицательное целое число (причем минимум 1 координата изменяется на положительное число).

Алгоритм решения этой задачи – DFS/BFS по состояниям, где состоянием является пара координат и две логических переменных, обозначающих то, отражал ли уже 1 (2) игрок точку относительно прямой y=x.

Всего состояний получается S <= 4D2 (пар координат) * 4(значений булевых переменных).

Обработка одного состояния занимает O(N) действий (только не нужно забывать пробовать отразить точку относительно прямой y=x, если данный игрок это ещё не сделал ранее в ходе игры). Таким образом, общая асимптотика O(ND2), что работает на С++ менее 200мс.

 

Также можно было заметить, что отражения не играют на исход игры, так как если в игре без отражений у игрока есть выигрышная стратегия, то он победит ,если будет ей следовать, использовав свое право отражения точки относительно прямой только после того, как соперник сам «отразит» точку.

 

Задача Е.

Для решения этой задачи требуется постепенно «передвигать» подотрезок и поддерживать:

1)множество В чисел, встречающихся один раз с функцией извлечения максимума за O(logN),

2)множество А чисел, встречающихся на данном подотрезке с хранением количества раз, которое данное число встречается на данном подотрезке с функцией проверки того, сколько раз встречается число на данном подотрезке за O(logN).

При движении отрезка с (a[i] .. a[i + k – 1]) на 1 элемент влево(a[I + 1]..a[I + k]) требуется:

1) Проверить, совпадает ли a[i]  с a[I + k]. Если да, то не требуется изменять множества,  иначе переходим к п.2 и 3.

2) Проверяем в множестве А, сколько раз встречается a[i]: если 2, то добавляем a[i] в В, если 1, то удаляем из A и В. Не забываем уменьшить соответствующее количество вхождений a[i] в текущий отрезок на 1.

3)Проверяем в множестве А, сколько раз встречается a[I + k]: если 0, то добавляем a[i] в В и в А, если 1, то удаляем из В. Не забываем увеличить соответствующее количество вхождений a[i] в текущий отрезок на 1.

 После этого, если множество В не пусто, извлекаем из него максимум.

Таким образом, асимптотика алгоритма O(NlogN). В качестве таких структур данных подходит set/map для тех, кто пишет на С++, и декартово дерево.

Разбор задач Codeforces Beta Round 63 (Div. 2)
  • Проголосовать: нравится
  • +31
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
На задачу Е можно было сжать числа до их номеров , а потом деревом отрезков сделать все.
Если не юзать готовые структуры, то это на мой взгляд самое легкое решение.
13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
You don't have to check reflections at all in task D. If player is in loosing position he can reflect coordinates, but the opponent (who had winnig strategy, so didn't use the reflection) also reflects.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Can you please explain this?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Lets see on game without reflects. Somebody have win strategy.

      So, in this game he should use it only after opp's reflection ad win
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится
      Suppose that we can't make reflections, so for each reachable position you can determine whether player who starts at this position has a winning strategy (no matter what his opponent does) or he must lose no matter what he does. Suppose that the player starts in losing position, so the only rescue for him is to reflect coordinates and then his opponent starts at losing position (if a position is losing/winning, then reflected position has the same state). But since his opponent has a winning strategy without using reflections, you know that he didn't need to use reflection and can use this reflection now to make his opponent start in losing position again.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Yes, of course. You are absolutely right.
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
For problem E , if my solution was O(n2) then it would have led to TLE?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Yes.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    n=10^5,so n^2 will certainly lead to TLE.
    Here is my approach:

    Process first K numbers at once. Store frequencies of each number in hash table and maintain a set which contain values which occurred only once. then process rest of the numbers while taking input. reduce frequency of i-K th number, modify the set according to frequency.

    Suppose input is:
    6 3
    1
    1
    2
    6
    6
    First i will process first 3 numbers. so the set will be {2} and map will be freq[1]=2,freq[2]=1.
    When i get 4th number 6,i will reduce freq of 1st number. freq[1] will become 1 from 2. as it has become 1,the set will be {1,2,6}(as i got 6 for the first time).

    Then i get 5th number 6,i will reduce freq of 2nd number. freq[1] is now 0. as it went 0 from 1, i need to remove it from set too. so the set becomes{2}(i will remove 6 too as i got it 2 times now).

    Every time print the largest number from set. If the set is empty print "nothing". i've used c++ stl <set>.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
please check my submission for problem C id: 350527 it says answer mismatch in line 2 but it does not...
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Декартово дерево? Можно сделать сжатие координат, а потом юзать прямую адресацию. Мне кажется, что это на порядок легче, чем декартово дерево. 
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Где можно про сжатии координат хорошо прочитать и попрактиковаться?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Хммм... даже не знаю:) Суть метода заключается в следующем: сами элементы мы заменяем на порядковый номер этого элемента в  отсортированном массиве. Понятно, что относительный порядок при этом не измениться. Конкретно в этой задаче, проделав такой трюк, можно было просто увиливать/уменьшать ячейку массива напрямую.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Посмотрите вот это по задаче A
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
About D:
"Thereby, we have the overall asymptotic O (ND^2), which works on C + + in less than 600ms"

My solution used the same complexity, but ran in 80ms. Reason (I think) is that once I find a move to a losing position, I declare current position as winning and return (i.e. no need to look at other moves).
This is trivial optimization, but I think an important one, because some Java solutions with O(ND^2) failed due to TLE. (600ms in C++ does not leave a good margin)

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

When I changed "double" to "int" in task E, I've got AC (with double - WA). But I can't find any words in problem statement about representation of numbers in answer. Also I can't find nothing in problem statement to determine if numbers are integers or not...

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

    ATTENTION! THIS CONTEST SHOULD BE UNRATED!

    Maybe now you will read my message carefully :) I think that Corny is right. His solution works just after replacing "double" to "int".

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      I've found problem. It with presentation, but it's my fault. When answer is 994790178 I write 9.9479e+008. I should be more careful next time.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Really? Ok, try to output floating-point numbers with 1e-10 precision.

        I think result would be the same :) 

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          I've tried to output correct floating-point numbers. It got WA. So maybe statement should be more precise.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
About Task C 
for this input 
1 1 2 2
a
b: a 2
c: a 1
1 a
1 a                                                                                                    

I am printing 

1
b 1

while the answer is

1
c 2

I can't see why my output is wrong (I think both outputs are correct in this case)                        
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    "It is guaranteed that after the i-th purchase no more than one opportunity to collect the composite artifact appears. If such an opportunity arose, the hero must take advantage of it."
    So your solution is wrong. After buyin first 'a' artifact player has oportunity to build artifact 'c' but in your solution he didn't take advantage of it, he waited for the second 'a' to compose 'b'