feecIe6418's blog

By feecIe6418, history, 17 hours ago, In English

Thanks for participation!

Update: added alternative solutions/proofs for A,B,D,F

1988A - Split the Multiset

Hint 1
Solution
Code (python)

1988B - Make Majority

Hint 1
Hint 2
Solution
Another Solution
Code (python)

1988C - Increasing Sequence with Fixed OR

Hint 1
Hint 2
Solution
Code (python)

1988D - The Omnipotent Monster Killer

Hint 1
Hint 2
Solution
Another Solution
Code (C++)

1988E - Range Minimum Sum

Hint 1
Hint 2
Solution
Code (C++)

1988F - Heartbeat

Solution
Code (C++, FFT)
Code (C++, Interpolation)
  • Vote: I like it
  • +92
  • Vote: I do not like it

»
13 hours ago, # |
  Vote: I like it +12 Vote: I do not like it

thanks for super fast editorial

»
13 hours ago, # |
  Vote: I like it +6 Vote: I do not like it

Super Fast!!

»
13 hours ago, # |
Rev. 3   Vote: I like it +66 Vote: I do not like it

there is also an O(n) solution for D.

we call the number of turn that a monster gets killed its colour.

we know that someone's colour is at most its degree +1.

if just maintain the two minimum colouring's and its colours for a subtree we can update our answer as follow:

we can fix the root colour from 1 to degre+1 and in each colourthe colouring for its children is the minimum colouring except the ones that its colour are same as the root. so their colouring is the second minimum one.

so we can solve it with a dp in O(n) time.

my code: 270694011

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it +4 Vote: I do not like it

    can u tell how?

    • »
      »
      »
      13 hours ago, # ^ |
        Vote: I like it +14 Vote: I do not like it

      I tried to explain in my comment. if I it wasn't clear for you, you can read granadierfc comment here with another explanation.

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Nice :))

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it +3 Vote: I do not like it

    I read that trees are 2 colorable, so I'm thinking if only 2 colors would be sufficient?

    • »
      »
      »
      12 hours ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      No

      2 Colors are not sufficient

      he tried to say that the maximum value of a color for a certain node would at max be it's degree + 1

      So if we declare a dp [ x ] [ t ]

      where x is the node and t is the time in which I kill the x the monster

      Then maximum number of second state that I would require for a certain node is it's degree + 1

      and sum of degree of all nodes is equal to 2 * N

      so we can say that overall there will 2 * N dp states.

      • »
        »
        »
        »
        11 hours ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Could you please point me out what is the mistake in the following logic:

        The problem states that "you cannot kill two monsters that are directly connected by an edge"

        So if I run a DFS and calculate depths of each node, then all nodes at an even depth are not connected by an edge, so I can kill all of them at once. Similarly, I can kill all monsters at an odd depth.

    • »
      »
      »
      11 hours ago, # ^ |
      Rev. 2   Vote: I like it +1 Vote: I do not like it

      two color wont work. Try:-

      4
      100 1 2 200
      1 2
      2 3
      3 4
      
  • »
    »
    11 hours ago, # ^ |
      Vote: I like it +20 Vote: I do not like it

    I am stuck on the thought that b≤3 always holds. Suppose a1,a2,a3,a4,a5 are the nodes connected in a line. In the first round, either {a1, a3, a5}, {a1, a4}, {a2, a4}, or {a2, a5} can be chosen. For the second round, there will be at most 2 nodes in a continuous segment that can be eliminated in the next 2 rounds.

    Can you please give a counter-condition?

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    What is the dp state for O(N)?

  • »
    »
    4 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Thanks for your nice solution!

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

omg fast editorial :-)

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I felt A >>> B in terms of difficulty

  • »
    »
    12 hours ago, # ^ |
    Rev. 2   Vote: I like it +2 Vote: I do not like it

    constraints are very low u can do simple recursion with base cases

    Spoiler
    • »
      »
      »
      10 hours ago, # ^ |
      Rev. 3   Vote: I like it 0 Vote: I do not like it

      the whole process can be simulated it would be complexity of 1e6 but map is needed so we keep frequency but t is 1000 so it will not pass

»
13 hours ago, # |
  Vote: I like it +76 Vote: I do not like it

Possible proof for A: Think of number n as n '1's in a chain, connected with n-1 bonds. Each step could break a maximum of k-1 bonds. Hence the answer.

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it +33 Vote: I do not like it

    Wow, this proof is really smart. Thanks for sharing!

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I think this similar to what is in editorial (just in a opposite way)

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it +3 Vote: I do not like it

    Really nice observation.

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I feel like an idiot after seeing your solution. I was doing it really hard way, which got WA.

    Here it is,

    void solve(){
            int n, k;
            cin >> n >> k;
    
            if(n ==1){
                cout << 0 << endl;
                return;
            }
            else if(n <= k){
                cout << 1 << endl;
                return;
            }
    
            int op =0, lk=0;
            if(n%k >0){
                if(n%k >1) lk++;
                n -= n%k;
    
                if(n/k <= k-1) lk += n/k;
                else{
                    op++;
                    int x = n/k;
                    op += x - k+1;
                    lk += x;
                }
            }
            else{
                if(n/k <= k) lk += n/k, op++;
                else{
                    int x = n/k;
                    op += x - k+1;
                    lk += x;
                }
            }
    
            cout << op + lk << endl;
    }
    
»
13 hours ago, # |
  Vote: I like it +24 Vote: I do not like it

Before attempting E: Range Minimum Sum, try these standard and easy version of the problem.

Standard

Easy Variations

Difficult Variations

In the past, I have also created a video on this topic.

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Here is an interesting problem that has sum of all subarray maximums as a subproblem. CC LIMITMEX

»
13 hours ago, # |
  Vote: I like it +15 Vote: I do not like it

Alternate for D : Note that a monster $$$v$$$ will die within $$$\leq deg[v]+1$$$ rounds. The problem could be formulated as follows , assign $$$t[v]$$$ (round number in which the monster gets killed) to each vertex $$$v$$$. Then you have to minimize the sum of $$$a[v].t[v]$$$ . For each vertex $$$v$$$ , we can keep a $$$deg[v] + 1$$$ sized vector , where each corresponds to the round number at which it was killed. Now using dfs and suffix / prefix minima , we can evaluate this value is $$$O(N).$$$

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Can you elaborate on what deg is and how to arrive at this conclusion?

    • »
      »
      »
      12 hours ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      Isolate a vertex $$$v$$$ , and look at all it's neighbours (the ones connected by edge to it) . deg or degree means the number of neighbours of a vertex $$$v$$$. At each round , either $$$v$$$ or atleast one of it's neighbours are chosen. If say none of them are chosen then you can simply choose vertex $$$v$$$ and have better answer.

    • »
      »
      »
      12 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      deg in this context means the degree of a given node v, which is the number of adjacent vertices to v. You can think of this as such: if there are no adjacent nodes of v which are being removed on a certain round, then there is no reason not to remove v on that round as it is just a free removal. Therefore to delay the removal of v as late as possible, there would be 1 adjacent node of v being removed on each round, until v is finally alone. Once you realize this, the rest can be followed as explained by the original comment.

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Could we kill all the monsters in just two rounds? Using bipartite algo, dividing nodes in two sets, then killing all monster of one set in round1 and killing all other monster in round2

    • »
      »
      »
      12 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      That's what i tried, not sure why it was wrong 270739384

    • »
      »
      »
      12 hours ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it
      Spoiler
    • »
      »
      »
      11 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      I tried that but it is wrong because you could have two monsters with large attacks in different sets, but the optimal strategy is to eliminate both of them even though it may take extra turns.

  • »
    »
    10 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Can you elaborate this approach further? How will you find the round number for each vertex such that $$$a[v].t[v]$$$ is minimised?

»
13 hours ago, # |
  Vote: I like it +7 Vote: I do not like it

Can somebody explain what is being done in D. Or at least direct me to relevant resources.

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it +7 Vote: I do not like it

    yea the editorial seems to skimp on the details. whats the DP recurrence here?

    • »
      »
      »
      11 hours ago, # ^ |
        Vote: I like it +6 Vote: I do not like it

      Let $$$m$$$ be the maximum value of $$$b$$$ for all nodes (as in the editorial). We first root the tree at any node. Then, we perform a DP where $$$dp[i][b_i]$$$ ($$$1\leq b_i \leq m$$$) is equal to the answer to the problem for the subtree rooted at $$$i$$$. If $$$C_i$$$ is the set of children of node $$$i$$$, then the DP transition is

      $$$dp[i][b_i] = a[i]\cdot b_i + \sum_{j\in C_i} max_{1\leq b_j\leq m, b_j \neq b_i} dp[j][b_j]$$$

      .

      • »
        »
        »
        »
        10 hours ago, # ^ |
        Rev. 3   Vote: I like it 0 Vote: I do not like it

        Thanks. This is the O(nlog^2n) solution right? Also why is it max, not min, since we want to minimize the damage?

      • »
        »
        »
        »
        9 hours ago, # ^ |
          Vote: I like it +1 Vote: I do not like it

        dp[i][bi]=a[i]⋅bi+ min of dp[j][bj] ***

        min not max

        .

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

can someone point out my mistake in c i did the same thing as editorial submission of c

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

These Python codes are really cute.

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

ty for fast editorial)

»
13 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Whats the counterexample for solving D by making the tree into a bipartite graph, then removing the side of the graph with the greater attack amount?

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Indeed. I attempted that method but got WA.

  • »
    »
    13 hours ago, # ^ |
    Rev. 2   Vote: I like it +3 Vote: I do not like it

    you can consider the line graph 1-2-3-4, with attack values 100, 1, 1, 100.

    • »
      »
      »
      13 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      ah fuck

    • »
      »
      »
      12 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      Why wouldn't that method work? Isn't it optimal to first get attacked by all monsters (hence a loss of $$$202$$$ health points) and then attack two non-adjacent monsters, to then be attacked by the two remaining ones before they, too, get killed? With a minimum decrement of $$$303$$$ ($$$100+1+1+100+(100+1)$$$)?

      In other words, the following: - First round, all monsters attack. $$$202$$$ health points are lost. Two non-adjacent monsters of $$$101$$$ and $$$1$$$ attack points get killed. - Second round, all remaining monsters attack. $$$101$$$ health points are lost. The rest gets killed.

      I believe I am missing something obvious here, but I don't see it.

      • »
        »
        »
        »
        12 hours ago, # ^ |
          Vote: I like it +2 Vote: I do not like it

        You can choose to kill 1st and last in the first turn. So total damage -> 202 + 2 + 1

      • »
        »
        »
        »
        12 hours ago, # ^ |
        Rev. 2   Vote: I like it 0 Vote: I do not like it

        In the first round you can kill the monsters with 100 attack power. so now you have 0--1--1--0 then take two more rounds to kill the other two. In this case the total damage will be 202+2+1

  • »
    »
    13 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    4
    100 1 1 100
    1 2
    2 3
    3 4

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Today first time i have solved 3rd problem

»
13 hours ago, # |
  Vote: I like it +6 Vote: I do not like it

best contest, but in my opinion E is easier than D

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I so almost solved D. Nice problems. Thanks for super fast editorial.

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    How ? Both of us had similar approach for D but its wrong . I think our approach is completely wrong . How is it almost solved ? can you give the bfs solution for D.

    • »
      »
      »
      2 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      No I am not talking about the one I submitted. I thought about dp on levels... But I think it needs further optimisation.

      • »
        »
        »
        »
        2 hours ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        And I think dp on levels will also not work. I thought why just now :(

»
13 hours ago, # |
  Vote: I like it +8 Vote: I do not like it

Can someone give me an example for problem D where $$$b_i$$$ is greater than $$$3$$$ for any node?

  • »
    »
    13 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    I'd like to see an example too. Here is my perhaps wrong proof:

    In the first round, you can reduce the whole tree to pairs of two or lone nodes. Because, imagine a line of 3 nodes: just remove the node in the middle and it becomes two lone nodes.

    Then, in the second round, remove all the lone nodes and 1 node from each pair of 2.

    Then, in the third round, remove all the lone nodes.

  • »
    »
    13 hours ago, # ^ |
    Rev. 2   Vote: I like it +62 Vote: I do not like it

     The optimal solution should be red -> green -> blue -> black. This can be generalized to any graph with $$$2^n$$$ vertices needing at least $$$n+1$$$ rounds, by adding another monster of sufficiently large attack power connected to each vertex in the configuration for $$$n-1$$$.

»
13 hours ago, # |
  Vote: I like it +5 Vote: I do not like it

Is it true that the total rounds in D is $$$ \le 3$$$?

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Why I can not solve a with brute force?

»
13 hours ago, # |
Rev. 2   Vote: I like it +27 Vote: I do not like it

I have a different solution for B. Compress adjacent 0s into just one 0 (ex. 0010001 -> 0101). Note that replacing every substring with majority 0 is of the form 0 + 10 * k such that k is an integer, so removing these strings doesn't change the number of 0s and 1s. Thus, just check if there are more 1s in this compressed string than 0s. Here is my submission link. I'm surprised that the intended solution is casework.

»
13 hours ago, # |
Rev. 2   Vote: I like it +51 Vote: I do not like it

A case for Bonus: Find a counterexample for $$$b_i≤18$$$ when $$$n=300000$$$.

Explanation: we delete all leaf nodes at a time. Then the tree becomes the largest subtree of the previous tree.

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    This structure is also known as binomial heap.

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it +8 Vote: I do not like it

    If you've learnt Binomial Heap, you'll find this construction is easy to access, for we're emphasizing the constraint on each node: each node with out-degree $$$i$$$ is directly connected to nodes with out-degree equal to $$$0,1,\dots,i-1$$$ exactly one each. And under this condition, we found a deletion with all nodes total degree $$$i$$$ on $$$i$$$-th round exactly fulfills the constraints of MEX.

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Problem B :(Make Majority) Video Editorial YOUTUBE VIDEO LINK (Make Majority) --Click Here

»
13 hours ago, # |
  Vote: I like it +17 Vote: I do not like it

Another solution to B

First, all continuous $$$0$$$ can be transformed into one $$$0$$$ using one operation. Then we can consider the simpler form.

It's obvious that the pattern like $$$101$$$ can be reduced into $$$1$$$, so all $$$0$$$ except the first and the last character. so we can just compare the number of $$$1$$$'s and the number of longest continous $$$0$$$ segment.

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

what's the expected rating of D?

»
13 hours ago, # |
  Vote: I like it +8 Vote: I do not like it

There's an $$$O(n\log n)$$$ solution to E without using the cartesian tree by calculating the contribution of each $$$a_i$$$

https://codeforces.com/contest/1988/submission/270728340

  • »
    »
    13 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    i also have some $$$O(n \log n)$$$ solutions with a fenwick tree and a segment tree, but it unfortunately got TLE :/

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I found for each element two left and two right minimums with set of indices. Adding contributions to answers are just with prefix sums

»
13 hours ago, # |
  Vote: I like it -6 Vote: I do not like it
»
13 hours ago, # |
  Vote: I like it +14 Vote: I do not like it

There is another solution for problem E. The point is to look at the contribution of each element in the permutation to the answers.

For each element we calculate the first and second element smalller than them to the left and to the right. This can be done in $$$O(n\cdot logn)$$$ using binary search and sparse table.

Then for each element we want to analyse the contribution of subarrays for which the current element is the minimum. We look at the segment of elements until the first smaller one to the right, let's say it has size $$$A$$$ (not including the element itself) and let's call the right one $$$B$$$. To everyone that is in the left segment, the number of subarrays for which the current element is the minimum is $$$A \cdot (B + 1)$$$ and for everyone in the right segment its $$$(A + 1) \cdot B$$$. For the first eleement smaller than the current element to the left, the number of subarrays is $$$(B + 1)\cdot ($$$ size of segment to the left including all elements up until the second element smaller than him $$$)$$$ . Same logic can be used to calcuate contribution of current element to the first ellement smaller to the right. For everyone else, that is everyone left of the first smaller element to the left and everyone right of the first smaller element to the right, the contribution is $$$(A + 1) \cdot (B + 1)$$$. Some edge-cases need to be handled for when there is no element smaller to the left or to the right however this is the gist. The contribution can be added up with lazy segment tree or even with prefix sums.

For details of implementation you can look at my code. code

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it +18 Vote: I do not like it

    You can do everything without any data structures btw 270718477

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    This is the method I used; however, you can use stacks instead of binary search and RMQ and use prefix sums instead of segtree to achieve O(N). 270713592

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

blazingly fast editorial

»
13 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

In editorial of pD, "taking max part" should be "taking min part"

»
12 hours ago, # |
  Vote: I like it +13 Vote: I do not like it

Did poor in this round, but really nice problems! The other side of getting bad result is finding unseen shortages for improvement :)

»
12 hours ago, # |
Rev. 3   Vote: I like it 0 Vote: I do not like it

nvm

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it +3 Vote: I do not like it
    Eg
»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I think for A, a simple proof (or rather intuition) can be : Let's say you do not divide the element into (k-1) 1's and (n-k+1), and lets say you divide it into some number (possibly zero) number of 1's and a bunch of other numbers. Let the minimum number be p, then, to make p into 1 again (which is our goal), you'll need another operation in the future to convert it. Thus, you are needing more than 1 operation to convert a number into 1. Greedily, we should ideally use only 1 operation to convert a number (or part of it) into 1's. Thus, the ideal strategy becomes to convert the numbers into (k-1) 1's and (n-k+1)

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

The suggested method for B feels unnecessarily complex and invites mistakes by having multiple cases. Instead, another approach is to collapse each continous sequences of 0 into a singular 0, then compare if there's more 1s than 0s.

My (python) code: https://codeforces.com/contest/1988/submission/270651964

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

B was a really easy question

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

For B I thought of splitting string into "101"/ "110" / "011". What is wrong with this solution? 270743982

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

In D, I used recursive DP[n][20] but still TLE in test case 20. Can somebody explain why?

Solution: https://codeforces.com/contest/1988/submission/270724498

  • »
    »
    8 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Check second last line in your DFS function .You are Not storing answer in dp array ,instead you are simply returning.

    • »
      »
      »
      3 hours ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      It is only for the root node i.e when parent==-1. for other nodes I am using dp.

      • »
        »
        »
        »
        2 hours ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        try submitting on cpp20

        • »
          »
          »
          »
          »
          102 minutes ago, # ^ |
            Vote: I like it 0 Vote: I do not like it

          still TLE on test case 20. Very strange all test cases are large but failing only at 20

»
12 hours ago, # |
  Vote: I like it +12 Vote: I do not like it

Another proof for # turns for pD: notice vertices not chosen in a round should connect to at least one chosen vertex, otherwise we can also choose it, then consider CC form by non-chosen vertices, every vertex in same CC would have different adjacent chosen vertices, then if there exist a (non-chosen)CC with size > n / 2, there also have > n / 2 chosen vertices, which means total nodes > n, which leads to a contradiction, so max size of CC form by non-chosen node would halve.

Then to construct the case where $$$O(\lg n)$$$ turns is needed, we can use the idea of above proof:

start with single node with weight $$$2^1$$$, call such tree $$$T_1$$$, then define $$$T_i$$$ ($$$i > 1$$$) as the tree by first use a node with weight $$$2^i$$$ to connect two $$$T_{i - 1}$$$, then for each node haven't connect to a node with weight $$$2^i$$$, create a node with weight $$$2^i$$$ and connect to it, then $$$T_i$$$ would have about $$$2^i$$$ nodes and require $$$i$$$ turns to eliminate.

»
12 hours ago, # |
  Vote: I like it +10 Vote: I do not like it

Hi, how to compute $$$f(n,i,j)$$$ in $$$O(n^3)$$$ in F editorial? I was only able to come up with $$$O(n^4)$$$ or $$$O(n^3 log(n) )$$$ solutions for this subproblem.

  • »
    »
    9 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    .

  • »
    »
    9 hours ago, # ^ |
      Vote: I like it +10 Vote: I do not like it

    Disclaimer: I haven't implemented it myself yet, but that seems to be the logic behind jiangly's solution (270732930)

    Let's build permutations of length $$$n + 1$$$ by inserting a $$$1$$$ into a permutation of length $$$n$$$ of numbers $$$2, 3, \dots, n + 1$$$, so we have $$$n + 1$$$ positions to insert to. These positions can have one of the $$$4$$$ types:

    1. First position. In this case both the number of ascents and the number of prefix maximums increases by one.

    2. Ascent positions, i.e. we insert a $$$1$$$ between elements $$$p_i$$$ and $$$p_{i+1}$$$, such that $$$p_i < p_{i+1}$$$. In this case both the number of ascents and the number of prefix maximums do not change.

    3. Nonascent positions, i.e. we insert a $$$1$$$ between $$$p_i$$$ and $$$p_{i+1}$$$, but $$$p_i > p_{i+1}$$$. In this case the number of ascents increases by one, but the number of prefix maximums stays the same.

    4. Last position. Nothing changes.

    Now we can count the number of positions of each of those types to get the transitions from $$$f(n, i, j)$$$:

    1. Only one, so $$$f(n + 1, i + 1, j + 1)~+= f(n, i, j)$$$.
    2. Exactly $$$j$$$, so $$$f(n + 1, i, j)~+= j \cdot f(n, i, j)$$$.
    3. There are $$$n - 1$$$ positions between two consecutive elements and $$$j$$$ of them are ascent, so $$$n - 1 - j$$$ are remaining: $$$f(n + 1, i, j + 1)~+= (n - 1 - j) \cdot f(n, i, j)$$$.
    4. Only one, so $$$f(n + 1, i, j)~+= f(n, i, j)$$$.
»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

In problem D, Why does the maximum B of a node is deg(x) + 1? I cannot find any comment to prove it.

  • »
    »
    12 hours ago, # ^ |
      Vote: I like it +5 Vote: I do not like it

    Because $$$b_u = \operatorname{MEX}_{(u,v)\in E}(b_v) \le deg(u)+1$$$

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

First, thank for very good contest and fast editorial I am going to share my O(n) solution for D We can notice that in optimal solution, monster in node v can be kill in at mode |v| round (|v| is number of node have the same edge with D, round number from 0) So we can call dp[v][round]: minimum number of health decreases when kill monster in node v after "round" dp[v][round]= ∑_(u ∈chill of v) (min)⁡(dp[u][j]) (j ≠round) (sorry, i don't know how to write beautiful fomular)

we can use pref_min and suf_min to quickly calculate Node that we must update parent value from chill due to tle Here is my code 270747003

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I see newbies solving C damn newbies these days are different breed,back when I was a newbie I couldn't even upsolve C by looking at editorial.But how does their submission looks alike?

»
12 hours ago, # |
  Vote: I like it +3 Vote: I do not like it

can anybody write a more intuitive proof for problem D's max of logn sets ?

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

where you guys show the range of the output from 1 to n ? not 0 to n? (Problem C)

Or am i missing something?

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Hi, I am finding it difficult to understand the solution provided to D. Can someone post a simple solution with an explanation or suggest updates in the existing editorial please?

»
12 hours ago, # |
  Vote: I like it +1 Vote: I do not like it

For B I believe we can also "compress" any amount of '0' in a row into a single '0', then simply check if the number of '1's is greater than '0's in the resulting string: 270654643

»
12 hours ago, # |
Rev. 5   Vote: I like it 0 Vote: I do not like it

For A, if we do in the reverse way, I think this is a problem like exchanging a new bottle by K bottle caps.

Like given [1, 1, 1, 1, 1, 1, ..., 1] containing n 1s, and we are going to combine at most K items once, and finally derive [n]. The process will be like [1, 1, 1, ..., 1] -> [1, 1, 1, 1, ..., K], containing N-K 1s and 1 K. Our target is to combine all numbers into 1 number, so the real number in the array doesn't matter at all, that it, there remains N-K+1 items to combine.

The maximum number of bottles that can be exchanged is floor((N-1)/(K-1)).

I think this is a classis problem, so you may find video explanations online. I elaborate one here: First give 1 bottle cap to your friend, and every time you exchange K-1 bottle caps with your friend's one, and give the exchanged bottle (cap) back to your friend. You can do this (N-1)/(K-1) times and you will finally exchange floor((N-1)/(K-1)) bottle caps and have remaining (N-1) % (K-1) bottle caps + 1 from your friend.

The difference between A and bottle exchange problem is that if (N-1) % (K-1) + 1 > 1, then you should do the final combine, so the answer is `ceil((N-1)/(K-1)) in this problem.

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Problem D got accepted in exacly 3 sec

[submission:https://codeforces.com/contest/1988/problem/D]

»
12 hours ago, # |
  Vote: I like it +2 Vote: I do not like it

Pretty surprise to see cartesian tree in $$$E$$$. Maybe it is the first time I see it in CF as well.

»
12 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

A felt hard. Came up with DP approach for A during the contest . Normal method was just not striking me.

A using DP
»
12 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Hello! Does my solution of D get RE because of dfs? 270748754

If yes, is there are way to bypass it nicely?

»
12 hours ago, # |
  Vote: I like it +2 Vote: I do not like it

Shouldn't the edi also contain the dp states and transitions atleast instead of just mentioning that you can solve it by dp? (for D)

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Another idea for B is that it is only possible iff the number of "0-streaks" is less than the number of ones.

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Please someone explain the bi<=19 part of the editorial in more detail.

»
12 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

In fact, problem D has a $$$O(n)$$$ way

Considering that we actually only transfer from the smallest and subsmallest points of each subtree when we transfer, in fact, there are only $$$O(deg)$$$ effective transfer points of a tree point, that is, only the number of selection rounds corresponding to the minimum value of each point, and their mex and mex+1, taking into account this, we only need to maintain the smallest and subsmallest points of each point to implement the $$$O(n)$$$ algorithm.

It comes with an implementation that uses map, which is just for convenience and can be replaced with another $$$O(1)$$$ structure

https://codeforces.com/contest/1988/submission/270751383

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Could someone provide an explanation of the DP used for Problem D?

Thanks!

  • »
    »
    11 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    If monster u is killed at time x , all its adjacent monsters v will be killed in range [1 , x — 1] U [x + 1 , upper bound ] . So dp[i][j] denotes the minimum cost to kill all monsters in subtree rooted at i , where ith monster is killed at at jth second .
    upper bound is log(n)

»
12 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Why does this code in java 270744757 tle but gives ac in c++ 270751728 :( Edit: I see that the c++ code also barely passes maybe i can do better with the transitions

»
12 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

In fact, problem D has a $$$O(n)$$$ way

Considering that we actually only transfer from the smallest and subsmallest points of each subtree when we transfer, in fact, there are only $$$O(deg)$$$ effective transfer points of a tree point, that is, only the number of selection rounds corresponding to the minimum value of each point, and their mex and mex+1, taking into account this, we only need to maintain the smallest and subsmallest points of each point to implement the $$$O(n)$$$ algorithm.

It comes with an implementation that uses map, which is just for convenience and can be replaced with another $$$O(1)$$$ structure

https://codeforces.com/contest/1988/submission/270751383

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I enjoyed today's problems. Thanks to the setters.

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

nice

»
11 hours ago, # |
  Vote: I like it +2 Vote: I do not like it

This codechef problem is harder version of B.

»
11 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

I believe my solution for problem E is also O(n), but doesn't require Cartesian tree. It is quite unpleasant to implement and debug though, I couldn't do so during the contest time.

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

thanks for editorial <3

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

What's wrong with this idea for D?

There are at most $$$O(\log n)$$$ rounds, so for round $$$j$$$, find the maximum weighted independent set, let it be $$$c_j$$$, then set the values of $$$a_{v_i}$$$ to 0 for each $$$v_i$$$ in the max ind set, and keep doing that until we get all zeroes in a. For round $$$j$$$, add $$$j \cdot c_j$$$ to the answer.

After all rounds, output answer. This fails on test 3 :|

  • »
    »
    11 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    4

    5 4 4 5

    1 2

    2 3

    3 4

    The optimal solution is 18 + 9 = 27. From what I understood, your idea will output 18 + 8 + 4 = 30.

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

How does the induction go in the proof of B?

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Problem E can be done by looking at the contribution of each values. If an index is removed then the affected contribution will the - - The contribution from the index itself. This we can find by calculating the left and right index smaller than the value at index. - The contribution coming from the other index that uses this index in their contribution. Here the observation this value will only change if we change the value between the left and right minimum of this index. If we remove left and right, then we have to consider second minimum left and second minimum right respectively and add it accordingly. All the value that is between left and right will only reduce the contribution by 1.

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

For problem D, am I the only one who decided to use sqrt(n) instead of log2(n) as the bound for b (for safety because I couldn't prove it in contest), only to find out that there's exactly one singular case where sqrt(n) < log2(n)? QAQ

»
11 hours ago, # |
Rev. 3   Vote: I like it 0 Vote: I do not like it

This is my approach for problem A, can you tell me what is the flaw in the argument? the picture link is the following, i don't know why it is not uploading: https://photos.app.goo.gl/VLXqFcDU2QHGFHap7

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I came up with DP on subtrees solution for D right after the contest but it got WA on 3rd test. It maintains dp[2][i], the maximum sum of monster points on subtree i we can get in the current round if we skip/kill the root node of that subtree. Can somebody help me understand why that failed?

270745002

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

not come up with '0110110' and got an WA on B :(

»
11 hours ago, # |
Rev. 3   Vote: I like it +2 Vote: I do not like it

$$$O(n)$$$ solution in problem E without cartesian tree (although it's long to explain what I'm actually doing): 270758048.

Edit: I miswrote the prev_greater and next_greater, it must be prev_smaller and next_smaller

  • »
    »
    11 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    That was clever to push all the popped elements from 1st stack to 2nd stack.

    I found first and second left/right minimum index using Fenwick tree 270751749

    • »
      »
      »
      10 hours ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      I'm not really the one who comes up with the two stacks approach. Last week, I solved a problem in Leetcode , which required to find the second greater element. Firstly I used segment tree for it, but then I know that 2 stacks O(n) approach from a guy.

  • »
    »
    10 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I did something similar I think, but i did the prev_greater thing with rmq, so it's $$$O(n log n)$$$. Nice code btw

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Can someone explain why I have to cast here?

I made a function that converts a binary string to decimal but it breaks at higher numbers. Specifically this statement:

num += (Long.parseLong(binary.substring(i-1, i)) * Math.pow(2,binary.length()-i));

However when casting to long this statement works as intended.

num += (long) (Long.parseLong(binary.substring(i-1, i)) * Math.pow(2,binary.length()-i));

Here is the working submission: 270754810

»
11 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

I don't get this line in A proof

and the aforementioned sequence of operation achieves the maximum increment.
I think you can actually get the same increment with doing another type of operation in some cases
like for example 
n=200 and k= 5
we can make it 
37 37 37 37 52 
»
11 hours ago, # |
  Vote: I like it +3 Vote: I do not like it

I solved E in $$$O(n log(n))$$$

How do you solve if you don't have to remove any element from the array? f(a)
Hint 1
Hint 2
Solution

My Solution

»
11 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I am unable to understand the reason for getting the following error in my code for Problem C 1988C][SUBMISSION:270720573 - Increasing Sequence with Fixed OR

wrong answer Integer parameter [name=a[35]] equals to 1000000000000000000, violates the range [1, 999999999999999999] (test case 102)

The question specifies 1<= n <= 10^18, and that a(i) <= n

Here is my code:- ~~~~~

include <bits/stdc++.h>

using namespace std;

int main() { int t; cin >> t; while(t--) { long long n, n2; cin >> n; n2 = n;

vector<long long> a;
    vector<int> pos;

    int size = 0;
    while(n2>0) {
        if(n2 & 1 == 1) pos.push_back(size);
        n2 = n2 >> 1;
        size++; 
    }

    a.push_back(n);
    for(int i=0; i<pos.size(); i++) {
        long long x = n;
        x = n - pow(2, pos[i]);
        if(x!=0) a.push_back(x);
    }

    cout << a.size() << endl;
    for(int i=a.size()-1; i>=0; i--) cout << a[i] << " ";
    cout << endl;                
}

} ~~~~~

The logic used here simply keep track of the places where the binary digit is 1 starting from position 0 at the right hand side (least significant bit).

Then I simply place 0 one by one in the in the positions where one are placed. For example: n = 1111, then

1111 1110 1101 1011 0111

Just shifting the 0 from right to left across all the positions that have 1, and keeping the position with zeroes as same.

If I have a n = 11100111, then

11100111 11100110 (0 placed at 0th pos from right) 11100101 (0 placed at 1st pos from right) 11100011 (2nd pos) 11000111 (5th pos) 10100111 (6th pos) 01100111 (7th pos)

I create the number with 0 in 6th pos by doing n — pow(2, 6) Which produces the same effect as placing 0 in the sixth position.

Please help me understand the flaw in my logic/code which is causing this unexpected error.

  • »
    »
    10 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    use brackets every where when writing any bitwise operator

    like -> if((n2 & 1) == 1)

    • »
      »
      »
      24 minutes ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      Made the changes. Still getting the same error. Here is the updated code

      int main() {
          int t;
          cin >> t;
          while(t--) {
              long long n, n2;
              cin >> n;
              n2 = n;
      
              vector<long long> a;
              vector<long long> pos;
      
              long long size = 0;
              while(n2>0) {
                  if((n2 & 1) == 1) pos.push_back(size);
                  n2 = (n2 >> 1);
                  size++; 
              }
              
              a.push_back(n);
              for(int i=0; i<pos.size(); i++) {
                  long long x = n;
                  x = n - pow(2, pos[i]);
                  if(x!=0) a.push_back(x);
              }
      
              cout << a.size() << endl;
              for(long long i=a.size()-1; i>=0; i--) cout << a[i] << " ";
              cout << endl;                
          }
      }
      
»
10 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Missed B by just 1 more condition -_-

»
10 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

why was this failing but if only I changed (n^(1<<i)) part to (((ll)n)^((ll)(pow(2,i)))) it worked

#include <bits/stdc++.h>
#define ll long long
#define fori(n) for(long long i=0; i<n; i++)
#define fori1(n) for(long long i=1; i<n; i++)
#define forj(n) for(long long j=0; j<n; j++)
#define testcases int t; cin>>t; while (t--)
#define ld long double
#define vl vector<long long>
#define vint vector<int>
#define pb emplace_back
#define fast ios::sync_with_stdio(0); cin.tie(0);
using namespace std;
int main()
{
    testcases{
        ll n;
        cin>>n;
        vector<int> s;
        for(int i=60;i>=0;i--){
            if((n>>i)&1)s.push_back(i);
        }
        if(s.size()==1){
            cout<<1<<endl;
            cout<<n<<endl;
            continue;
        }
        cout<<s.size()+1<<endl;
        for(int i:s){
            cout<<(n^(1<<i))<<" ";
        }
        cout<<n;
        cout<<endl;
    }
 return 0;
}
»
10 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Can someone please explain what is going wrong in this solution? I tried to subtract the power of bits which were 1 in n from n.270761320

  • »
    »
    10 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Your code has 1<<v[i] this will overflow, you should typecast it to long long. Ex: 1ll<<v[i]

»
10 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Wow, super fast editorial! Thanks!!

»
10 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Another approach for B:

Replace every clusters of 0's with a single 0 and leave 1's as it is, as we always want to increase the number of 1's in our string. Now, count the number of 1's and 0's in it. If 1's > 0's, then the answer is "yes" else "no".

»
9 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

in A how it , for n=772,k=295 step=3; by me in first step 772=295,295,185 then these three number can make 1 in 3 step so total step is 4

»
9 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Finding it hard to understand Problem D Solution can someone point me to a different tutorial maybe video explanation ?

»
9 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Interesting competition, I believe we needed like 30 min more for better distribution. Right now 7000 people competing solved first 3 proiblems and than only < 800 solved 4th. With bit more time I believe we would have like ~2000 people on 4th and that would give us a lot better distribution of scores.

»
9 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I am looking for help in problem D, because I had an alternative approach (semi-greedy) and can't find any counterexample.

My algorithm goes as follows:
While vertice count > 0:
1. Find a Maximum Weighted Independent Set (MWIS) in the remaining forest.
2. Remove all vertives belonging to MWIS from the forest.

Maybe there is fundamental error in idea, maybe bug in implementation 270734719. Any help would be appreciated. Thanks.

  • »
    »
    9 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    4

    5 4 4 5

    1 2

    2 3

    3 4

    Try this one. The answer is 18 + 9 = 27.

  • »
    »
    8 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Having "big steps" is good, unless number of steps isn't much.

    For example you could finish everything in 2 steps, because tree is bipartite. Removing each part on each step. And it isn't obvious why you algo is better than that. That is the problem with your approach.

»
9 hours ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

My logic for C :-

int right = 0;
    while(n!=0)
    {
        int rm = n & -n;
        n ^= rm;
        int x = n|right;
        if(x) v.push_back(x);
        right |= rm;
    }
»
8 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

I was trying to Upsolve D. I read the edi and got the DP approach. I coded it up and was constantly getting TLEs. I optimized a lot (converted map<int, vector> to vector<vector> for the adjacency list, included all fastio, used as less space as possible etc).

I was still getting a TLE, so I had a look at my friend's solution who got an AC in the contest. It was literally the same thing. So I copy pasted it and that also got a TLE. What could be the reason for this ?

Both the codes are literally the same.

  • »
    »
    8 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    The language is a bit different + your friend's solution is not that fast in the first place so...

  • »
    »
    8 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    i copy pasted your code and got AC 270774740 lol

»
8 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

https://codeforces.com/contest/1988/submission/270773130

can anyone help what am i doing wrong above?

»
8 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Another approach For b if we take all the sequences of 000 and combine them to form a single 0 then The resulting string would only have single 0 and other 1's so if we count no. Of 1's here and if they are greater then no. Of 0's then answer is YES else answer is NO.

Can't think of a proof but it passed all test cases

  • »
    »
    7 hours ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I did it too

  • »
    »
    6 hours ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    I had the same solution. The proof is pretty simple. Notice that after combining all zeros together you have a sequence where each zero is surrounded by ones. Suppose oneCount > zeroCount, by combining two ones with a zero, you decrease the total amount of 1s and 0s by one. If you repeat this over and over a again, you will reach a point where there is one zero and more than one one. Conversely, it is clear that if the number of zeros is more than or equal to the number of ones, the answer is NO.

    Edit: I just realized you can just choose the whole array :)

»
6 hours ago, # |
Rev. 3   Vote: I like it +1 Vote: I do not like it

my clarification for log(n) in problem D, I hope this help someone: suppose in the worst case that you have set of monsters with attack point equal to MX (for example 1e12) and these all nodes connected with all vertices in the tree, then the optimal choice for current round is to select these nodes, then number of nodes now is at least n/2, in the second round suppose the same that you have set of monsters with attack point equal for example MX-1 then best choice to select these nodes, and number of nodes now equal (n/2)/2 ... and so on then after the first round you have n/2 node after the second round you have (n/2)/2 node after the third round you have ((n/2)/2)/2 node .... and so on. then in the worst case there is log(n) rounds.

then now easily you can use dp on tree from any node state: dp[u][r] which is you at node u and at round r transaction: move to each child with round equal any number from 1 to log(n) except current r and choose the minimum

that is my code it may help: https://codeforces.com/contest/1988/submission/270781650

»
3 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by feecIe6418 (previous revision, new revision, compare).

»
3 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by feecIe6418 (previous revision, new revision, compare).

»
101 minute(s) ago, # |
  Vote: I like it 0 Vote: I do not like it

The description of Jiangly's solution in problem F has somthing wrong, we can't do $$$ans_{i+j}\leftarrow g(j,y)v_{i,x}$$$ without iterating $$$y$$$, and I guess that the translation shoulb be $$$v_{i,y}\leftarrow f(i,x)h_{x+y}$$$ and $$$ans_{i+j}\leftarrow g(j,y)v_{i,y}$$$.

»
76 minutes ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by feecIe6418 (previous revision, new revision, compare).

»
52 minutes ago, # |
  Vote: I like it 0 Vote: I do not like it

https://codeforces.com/contest/1988/submission/270807781 where am i doing wrong cananyone please help me

  • »
    »
    2 minutes ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Here's a counter example for your code:

    1
    4
    1000000000 1 1 1000000000
    3
    1 2
    2 3
    3 4
    
»
37 minutes ago, # |
  Vote: I like it 0 Vote: I do not like it

guys in the proof of problem D, it is mentioned that:

f(u) ≥ 1 + ∑ [1≤i<u] f(i)

I don't understand this. it is assumed that u is the greatest possible colour in the whole tree. But the same condition might not hold for the direct children of the root. (for their respective subtrees). so why is the recursion formula true?