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

Автор Tima, история, 10 лет назад, По-русски

Только что закончился Гран-При Азии. Подскажите, как решать задачи B, J ?

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

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

J: Если выполняется условие, что сумма степеней 2n-2 , то ответ это вторая формула в http://e-maxx.ru/algo/prufer_code_cayley_formula#9

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

    The intended solution doesn't require any theorem.

    Let x, y, z be the number of vertices with degree 1, 2, 3, and let f(x, y, z) be the answer.

    1) If y > 0, f(x, y, z) = f(x, y-1, z) * (the number of edges), because we can "insert" a vertex of degree 2 in the middle of an edge. 2) If y = 0, except for some small cases, f(x, y, z) = f(x-1, y+1, z-1) because the removal of one particular leaf will change a vertex of degree 3 to a vertex of degree 2.

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

Как решать А и Н?

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

    Quick hints:

    A: We can generate all divisorful numbers. If we consider only 3-smooth numbers and define divisorful numbers similarly, can you compute all such numbers? How about 5-smooth numbers? 7-smooth numbers? And so on.

    H: First, for each i, compute the number of ways such that

    • Start from (0, 0).

    • Walk for i steps.

    • After i steps, return to the original position for the first time.

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

    H: Сначала нужно перейти от мат. ожидания к сумме по всем клеткам вероятности, что мы когда-либо окажемся в этой клетке. Теперь рассмотрим любую клетку на некотором пути. Пусть в последний раз на этом пути мы оказались в ней после k-го шага. Тогда нам нужно прибавить к ответу вероятность того, что мы придём в клетку (x, y) на k-м шагу и после этого больше не вернёмся в эту клетку за оставшиеся n - k шагов. Обозначим zk — количество способов выйти из (0, 0), сделать k шагов и ни разу не вернуться в (0, 0). , где — количество способов попасть в (0, 0) за i шагов, стартовав из (0, 0). Таким образом, ответ это , где qxyk — количество способов попасть в (x, y) из (0, 0) за k шагов. Если поменять порядок суммирования, то qxyk просуммируется к 4k. Таким образом, ответ это просто .

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

B: Найдем 4 точки (max(x+y), min(x+y), max(x-y), min(x-y)). Добавим все ребра, концами которого есть хотя бы одна из этих точек. Найдем максимальное остовное дерево в таком графе. Минимальное взятое ребро и будет ответом.

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

    а можно доказательство этого решения

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

      Пусть в ответе есть ребро (x1,y1)--(x2,y2), и для определённости x1<x2, y1<y2. Пусть точка (x4,y4) — это максимум x+y, а точка (x3,y3) — это минимум x+y. Тогда следующие три ребра не короче нашего: (x1,y1)--(x4,y4)--(x3,y3)--(x2,y2), и поэтому наше ребро не нужно.

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

    Другое решение — поменяем координаты точек на (x[i]+y[i],y[i]-x[i]). В таких координатах манхеттенское расстояние равно максимуму модулей разностей координат.

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

    Две вершины будут связаны, если модуль разницы хотя бы по одной из координат не меньше текущего ответа.

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

    Получившийся граф проверим на связность и в результате куда-то сдвинем границу бинпоиска.

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

У вас тоже не работали сервера Div.2 в последний час?

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

How to solve M?

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

Еще интересно решение по С.

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

    Сгенерить все разности, и понять, куда мы можем сдвинуться за четное число ходов — это все возможные суммы этих разностей. Можно доказать, что если мы хотим попасть в что-то в пределах 10^4, то можно за эти пределы не выходить, поэтому bfs работает за 104 * 104

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

      Можно проще: заметим что каждый нечетный ход добавляется к позиции, а четный отнимается. Тогда мы будем делать bfs на таком графе: каждой позиции на линии соответствуют две вершины, одна — это минимальное расстояние при условии что последний ход был нечетным, вторая соответственное что четным. Это будет n * 2 * 10 ^ 4

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

What is test #3 in problem L ?

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

How to solve G?

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

Див. 2: Примерно с 4-ого часа соревнований — "Service is not available". До сих пор.

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

How to solve F?

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

    Few corner cases. If we have only one color, the answer is -1. Another corner case is the second sample — we have some cards of the same color and a card of some other color between them. The answer is 0 in this case.

    Now let's move to the general approach.

    Let's decrease each a[i] by one. Now we have to find the amount of such numbers k, the a[i]/k == a[j]/k if and only if c[i] == c[j].

    The key observation is that for fixed number N there are only different values of N/i for all possible values of i.

    Based on this we can build a set of constraints in form of

    1) Segment [l; r] may be the answer (we get this from a pair of cards with the same color)

    2) Segment [l; r] can not in be the answer (we get this from a pair of cards with different colors)

    To find the answer we should find the total length of the segments, that are covered by all of the constraints of the first type and are not covered by any of the segments of the second type. This can be done using some kind of a sweeping line.

    Code

    By the way, you asked the question in the Russian thread

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

Where can I find the final standings?

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

how to solve I?

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

    We only need some edges. For every point we can reach this point from maximum 4 points(point J which has smallest Y, X[I] = X[J] and Y[J] > Y[I] and have direction 'D'.also for all other 3 direction). So we only have maximum 4 * N edges and now we can use simple dijkstra algorithm to get switch time of every robot. solution author LashaBukhnikashvili

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

How to solve D?

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

    If someone is still interested in solution, it's dp[i][j] where i and j are the suffixes of the given permutations. If s1(i) != s2(j) then dp[i][j] = dp[i + 1][j] + dp[i][j + 1]. If s1(i) = s2(j) so let len be the length of the longest common prefix of these suffixes. Then we are in danger of counting some array twice untill one of our indices(i or j) has reached position i + len + 1. So let's say i will move to i + len + 1 before j will move to j + len + 1. Let's try every k so that we will go to the state dp[i + len + 1][len + k], k <= len. We need to count number of arrays that can be obtained from substring (i ... i + len) of the first permutation and from substring (j ... j + k — 1) of the second permutation. We will avoid double counting if we will not take number from the second permutation if we took less numbers from the first permutation. So it's equivalent to the number of bracket sequences with len opening brackets and k closing brackets. It can be precomputed by simple dp or using formula described in this comment http://mirror.codeforces.com/blog/entry/23266?#comment-276645. Then we have do the same for the index j. There are only O(n) such states.

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

Does anyone know how to solve problem J?