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

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

Let us discuss div2+div1 today's Opencup problems here

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

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

How to solve div2 D Nice set of Points?

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

How to solve B and J?

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

And G?

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

How to solve H?

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

    The solution is based on Sprague–Grundy theory. Let's solve the problem where we have only one bean:

    We are going to calculate the grundy function for each i. According to the theory:

    Gi = mex(Gi - Ci, Gi - Ci + 1, ..., Gi - 1), where mex is the minimum non-negative integer, that doesn't appear in the set (e.x. mex(0, 1, 4) = 2 ).

    To find it on O(logn) I used a segment-tree, where I kept for each number in range [0, 105] it's last appearance in G. Having this information, we run a simple recursion to find the minimum number, which last time appeared earlier, than i - Ci. It is our Gi, now we update the tree.

    After calculating G, let's calculate the answer. According to the theory, Ggame is the xor-sum of all Gi, such that Ai is odd. The answer is "Second" if Ggame is equal to zero, otherwise "First".

    code

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

Как решать задачу I? У меня была весьма простая в реализации идея: решать задачу с конца. Тогда мы будем красить ребра посещая их первый раз и после этого свободно возвращаться по уже покрашенным ребрам обратно. В коде это — перебор стартовой вершины, а дальше дфс из нее по состояниям [вершина][цвет], помечая ребра нужного цвета как покрашенные. ВА17 без идей, что не так =(

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

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

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

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

      Спасибо.

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

Как решается задача L(Race) из див 2 о гоночных машинах. Спасибо.

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

How to solve E and F?

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

    E
    You need 3 facts (I'll list them without proof). First, our trajectory has period g = gcd(h, w). Second, if the trajectory period has u up moves (along h side) and r right moves, then gcd(u, h) = gcd(r, w) = 1. Third, any trajectory satisfying these constraints is good, so the answer is , where gcd(u, h) = gcd(g - u, w) = 1.

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

    F
    Note that every empty cell that's neither start nor finish has exactly one vertical and one horizontal connection. This means that for every line (row or column) we can go from one side and greedily pair empty cells with connections (this implies the number of empty cells is even). This works for all lines that contain no end points and gives a hint where finish can be located: if there's 0 lines with odd number of empty cells, it is in the same line as start, if there are 2 — start must lie in one of them and finish in the other, and if it's more than 2 — the answer is NO. We have O(N) candidates for finish, we just check all of them and construct the path in O(N2) for each. I heard this solution can even be improved to O(N2) if we build DSU over the paths once for every line where we check the finish position.

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

Are Opencup problems open to the public?