paulzrm's blog

By paulzrm, history, 6 months ago, In English

2173A-Sleeping Through Classes Idea & Solution: HHH666666

Tutorial
Solution

2173B-Niko's Tactical Cards Idea & Solution: HHH666666

Hint 1
Hint 2
Tutorial
Solution

2173C-Kanade's Perfect Multiples Idea & Solution: paulzrm

Hint 1
Hint 2
Tutorial
Solution

2173D-Taiga's Carry Chains Idea: chen_zida Solution: paulzrm

Hint 1
Hint 2
Tutorial
Solution

2173E-Shiro's Mirror Duel Idea & Solution: paulzrm It's my favourite problem :-)

Hint 1
Hint 2
Tutorial
Solution

2173F-Isla's Memory Thresholds Idea & Solution: paulzrm

Tutorial
Solution
Bonus
  • Vote: I like it
  • +123
  • Vote: I do not like it

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

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

»
6 months ago, hide # |
 
Vote: I like it +17 Vote: I do not like it

It's great to see another sqrt problem appearing in the round.

»
6 months ago, hide # |
 
Vote: I like it +1 Vote: I do not like it

thanks for quick editorial and nice problems

»
6 months ago, hide # |
Rev. 3  
Vote: I like it +2 Vote: I do not like it

.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

If you ain't getting the code for C in editorial (if you are low like me idk) :

Refer this

»
6 months ago, hide # |
Rev. 2  
Vote: I like it +1 Vote: I do not like it

Luckily I didn't waste time on D initially and skipped to E.

Solved E within 20 minutes ( including Logic + Coding ).

I went in wrong direction in D. kept using BFS, and tried to prune branches in BFS. but kept failing.

»
6 months ago, hide # |
 
Vote: I like it +11 Vote: I do not like it

it's said in the editorial for F that x <= n even though x <= 10^9

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

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

»
6 months ago, hide # |
 
Vote: I like it +1 Vote: I do not like it

Seems to me you forgot to mention fixing middle element in case of odd $$$n$$$ in E's tutorial. In current state editorial is factually incorrect, if $$$pos[x]$$$ is at exact middle, one of the two swaps doesnt make $$$x$$$ and $$$n+1-x$$$ symmetrical.

»
6 months ago, hide # |
 
Vote: I like it +16 Vote: I do not like it

For problem D: since $$$\log_2 n$$$ is small, dp is not needed. An $$$O(\sqrt{n})$$$ solution 352084821 can also pass.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    Can you please explain your solution.

    • »
      »
      »
      6 months ago, hide # ^ |
       
      Vote: I like it 0 Vote: I do not like it

      i think add 2^i is opt , the carries got = new zero , try with many i = "if n > 0 { ans = ans.max(solve(n >> n.trailing_zeros(), k))}" (don't care bit zero before i)

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

      The worst situation is when n=(10101010...)2

      Let the time complexity be T(l) when the length of n in binary is l

      Note that one branch decreases the length of the number by 1, the other decreases it by 2. So T(l)=T(l-1)+T(l-2) which is Fibonacci sequence.

      T(log2n) is close to sqrt(n) so I guess that's why the author said it was O(√n)

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

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

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Can someone help me debug my E code: https://mirror.codeforces.com/contest/2173/submission/352087156

It gives me wrong answer Test 13: finished but permutation is not identity. (test case 13)

The idea i tried to implement is whenever i encounter an index when i!=p[i] i will keep query to swap i and p[i] till number of swaps for i and p[i] is odd so i put current p[i] in correct place and the number of swaps for n-i+1 and n-p[i]+1 is even i,e no change on there value

ik this solution would probably make more than intended number of queries but what i am not able to understand is how I am getting finished but permutation is not identity.

Any help is appreciated thanks!

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    This happens when one of the elements appears in the middle of the array.

    Say you want to swap $$$a$$$ and $$$b$$$ in $$$[b, a, c]$$$.

    Step 1: query 1 2 ans 2 3: $$$[b, c, a]$$$ c0=0 c1=1

    Step 2: query 1 2 ans 1 2: $$$[c, b, a]$$$ c0=1 c1=1

    Step 3: query 1 2 ans 2 3: $$$[c, a, b]$$$ c0=1 c1=2

    c0 is odd and c1 is even, but the array becomes a total mess.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    just try to fix 2 end point once they are fixed go to next. cz if you fixed any 2 end point they will never be swap again. code : 352120897

»
6 months ago, hide # |
Rev. 3  
Vote: I like it 0 Vote: I do not like it

2173

Whats wrong with this solution of mine for problem D?

Idea: Maximum carries occur when adding to a long chain of consecutive 1s. Spend first (k-1) moves creating the longest possible chain of 1s by adding to zeros between 1-blocks. Last move: add 2^ℓ at chain start → carries = chain length.

Example:

n = 13 (1101), k = 2:

Move 1: Add 2^1 → 1111

Move 2: Add 2^0 → 10000 (4 carries, chain length 4).

Total = 4. Use sliding window to find max chain length with (k-1) flips, then compute total carries over all moves.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

D and E are amazing!!! I love them.

»
6 months ago, hide # |
 
Vote: I like it +4 Vote: I do not like it

bro i couldnt even solve a single question in this contest. been grinding for past 10 days, this demotivated me a lot

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it +1 Vote: I do not like it

    keep going!

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it +1 Vote: I do not like it

    It's ok, keep going even if you feel stuck, one day it's going to click.

    also, a very good advice someone told me is, when you are training try not just to learn how to solve this specific problem, but think of what general techniques used to solve this problem that can be used to solve other problems

    for example, if a problem asks how many zeros you can take, you can "think in reverse" and say how many zeros I can't take? this is like a general idea that makes many problems easier, so try to catch those while training, and after a while, your mind works using the ideas you learned naturally

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Can anyone please tell whats wrong with my greedy code (352103241) for Problem D.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    Counter example n = 461 k = 2, answer should be 5 your code outputs 4

    There is no need to flip 0s everytime, sometimes flipping all ones greedily gives optimum.

»
6 months ago, hide # |
 
Vote: I like it +40 Vote: I do not like it

Problem F.

Bonus There exists an $$$O(n\sqrt{n})$$$ solution.

I’m interested in this solution. Are there any hints or references?

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it +17 Vote: I do not like it

    You can replace the binary search with the following approach: first perform exponential search to find the appropriate interval, and once the length is determined to lie between $$$2^k$$$ and $$$2^{k+1}$$$, perform a binary search within that interval. With this modification, the analysis yields a running time of $$$O(n\sqrt{n})$$$.

    • »
      »
      »
      6 months ago, hide # ^ |
       
      Vote: I like it 0 Vote: I do not like it

      It took me a while to think why it works, but it actually works.

      My sketch
  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    I think maybe we can just leave out the binary search in the second part as we know the length will be > sqrt(n) and we sum of length of each step is limited to n so we can move atmost sqrt(n) time

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

i missed the first one by one edge case damnn

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

thank you for this contest and fast editorial

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

In C, what if we have an array of all primes? Wouldn't this solution get tle?

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Love problem C !

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

can someone explain : finished but permutation is not identity . thanks

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

I’m looking to join a consistent and active CP peer group to practice regularly, discuss problem-solving approaches, and improve together.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

There is a simpler idea for E. Let X be a number of correctly placed numbers. At each step just calculate for each pair of indices (i, j) a math expectation of X after a swap. Greedily select a pair of indices with best expectation. In order to don't get TL, don't try every pair, but for each index i try only "reasonable" indices j, which are: 1) an index at which current i's number should be; 2) an index at which number i stays now. That's it. Implementation: https://mirror.codeforces.com/contest/2173/submission/352126084

»
6 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

Problem E is so interesting! I thought I need to put smaller number on left part (after grouping), but that actually will result in limit excess.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Was I the only one who felt problem statement of A wasn't that clear? according to me 110 k=1, answer should've been 1 but problem statement meant different of what I understood.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Loved Problem C!

»
6 months ago, hide # |
 
Vote: I like it +6 Vote: I do not like it

I solved D with greedy : submission. Not the most optimal approach but i found it very intuitive.

So the main idea behind it was that if you pick a set of consecutive 0s and decide to set any one of these bits (by adding 2^x) then in the optimal case all of the 0s should be set (so that they connect 2 set of consecutive 1s). So i just brute forced using bitmasks by selecting which sets of 0s i will completely set, and then greedily took the biggest set of consecutive 1s from the new number formed based on how much k i have left after setting the selected consecutive 0s.

The max number of consecutive 0s can be 15 (alternate 0 1 0 1 => max = 30/2), so my code might take upto 15 * 2^15 * 1000 operations(as t <= 1000) which is roughly 5 * 10^8. It passed with a total time of 1.2s. Let me know if you are able to hack it!

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    I tried something like this but encountered too many corner cases

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    I had the same approach as you, but TLE. Then, I literally submitted your code post-contest (sorry), and it got TLE on test case 21.

    • »
      »
      »
      6 months ago, hide # ^ |
       
      Vote: I like it 0 Vote: I do not like it

      dont say sorry lol. i did a few edits and submitted my code again and it passed in 1.3sec, weird.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it +3 Vote: I do not like it

    Your solution is insane. I had a similar greedy idea, but didn't dare to dive in.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    So, just repeatedly add 2^l on the biggest block of consecutive ones (with length len) to get len carries?

    And at some point the entire thing will become 2^x in which case you just keep adding onto the most significant bit?

    Thanks!

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

interesting contest. i could have solved D if i had passed C faster, but the time was limited. qwq

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Can anyone explain the DP for D? I understand why we want to minimize the number of bits by the end, but I can't wrap my head around the DP to actually achieve that.

  • »
    »
    6 months ago, hide # ^ |
    Rev. 2  
    Vote: I like it +1 Vote: I do not like it

    The point is to not think about how dp[i][j][k] is formed, but form the next states based on what you already have.

    Notice that adding 2^j on the same index is never beneficial, coz we already know k < total_bits and once you use a 2^j there is definitely an other index where you can use to get more carries.

    Suppose you are at the ith bit having used j operations of adding 2^j on bits before the ith bit, now there are two possible cases-

    1) You use the operation(add a 2^j) on that bit which results in some carry. 2) You do not use operation on that bit.

    Simulate whatever carry you get and whatever bit stays in that position based on the carry will be added to the next state of the dp, because you are calculating dp[i][j][k] as the number of set bits.

    By the way dp[i][j][k] is defined as reaching the ith LSB using the addition of 2^l j times on bits before the ith one and having a carry of k. Note that k can never be greater than 1.

    Effectively your dp is just (bits + 1) * (k + 1) * 2 states

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

I have a more concise way to write problem E that might be essentially the same as the editorial.

submission

If it is wrong, please tell me

»
6 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

I'm not sure why this solution for problem E works: 352146525

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

In Problem E, I wasn’t initially sure why my solution got accepted 352174671. My approach is to keep swapping until the permutation becomes sorted, but I only move to the next index when the swap makes either the current position correct or the corresponding mirror position correct.

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Is there a greedy solution for D :

Along the following lines :

If K > number of zero between lsb and msb then we can always reach a power of 2 .

otherwise :

We know any blocks of 1 merging with another will only increase the size of the other block by 1 maximum .

so this leads to a greedy approach of always picking the maximum block length with careful tie breaking .

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

If you want to get in-depth understanding of problem B's solution,
Here is my video solution : Link. (It's in Hindi lang).

»
6 months ago, hide # |
Rev. 3  
Vote: I like it 0 Vote: I do not like it

I used a much more simple way to solve E.

My Code


The main part and the only part of mine is to place both i and n-i+1 in one round(caution here: not one operation), with just easily keeping swap them.

I think the expected times of this is 5m (m is the count of rounds).


After one (i, n-i+1) was done, I found that in the latter process(the part shown up there), we wouldn't adjust their position anymore when we optimize our operates.

Thus, all pairs of (i, n-i+1) pair is unrelated. And the last remained number can automatically get its position after other numbers are swapped to their own place, so m equals floor(n/2).

The total expected times of operates is 2.5n.


Proof is listed below:

Set expected operation of each round as E=E1+E2. (E1 is the expectation of swapping either i or n-i+1, while E2 is the expectation of another)

With some calculation, it's easy to find:

(1/2)+(1/2)*(E1+1)=E1

(1/2)+(1/2)*(E2+2)=E2

So E equals 5.

  • »
    »
    6 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    can u explain ur calculation a bit more precisely ?

    • »
      »
      »
      6 months ago, hide # ^ |
      Rev. 3  
      Vote: I like it 0 Vote: I do not like it

      sure. and also you did remind me that I made sth wrong :p


      In the first step, the goal is to home one number.

      The possibility to finish it is 1/2.

      If it's not finished, it backed to the initial situation (and it requires another E1 operation in expectation).

      That's how I got 1+(1/2)*E1=E1.

      (another form is: (1/2)+(1/2)*(E1+1)=E1, and I made mistake on the (1/2)+ )


      In the second step, the goal is to home the another number.

      The possibility to finish it is also 1/2.

      But when it's not finished, the homed number in step 1 was out of its position. Specially, the positions of the two number now mirror, so it needs exactly 1 operation.

      That's how I got 1+(1/2)*(1+E2)=E2 (another form is: (1/2)+(1/2)*(E2+2)=E2 )


      I wrongly wrote my equation earlier. Sorry for the loose thinking.

    • »
      »
      »
      5 months ago, hide # ^ |
       
      Vote: I like it 0 Vote: I do not like it

      For E, I was also trying to understand this (related) solution:

      vector<int> p(n + 1), pinv(n + 1);
      for (int i = 1; i <= n; ++i) {
      	scanf("%d", &p[i]);
      	pinv[p[i]] = i;
      }
      
      for (int l = 1; l <= n / 2; ++l) {
      	int r = n - l + 1;
      	while (l != p[l] || r != p[r]) {
      		int m = p[l] == l ? r : l;
      		printf("? %d %d\n", m, pinv[m]);
      		fflush(stdout);
      		int u, v;
      		scanf("%d%d", &u, &v);
      		swap(p[u], p[v]);
      		pinv[p[u]] = u;
      		pinv[p[v]] = v;
      	}
      }
      

      Analysis: Fix an iteration of the for loop. In expectation, we reach $$$p[\ell] = \ell$$$ after at most 2 swaps. After that, with probability $$$1/2$$$ we obtain $$$p[r] = r$$$ in 1 swap (in which case we are done), and with probability $$$1/2$$$ we go to a state such that $$$(\ell, \text{pinv}[\ell])$$$ and $$$(\text{pinv}[r], r)$$$ are mirrors of each other. In this special situation, it takes in expectation only 4 swaps to fix both $$$\ell$$$ and $$$r$$$. There are $$$n/2$$$ iterations of the main loop, so this is gives $$$\frac n 2 \cdot (2 + \frac 12(1 + 5)) =2.5n$$$ swaps in total.

»
6 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

Why is the complexity for C $$$O(nd(n)logn)$$$? I think, the worst case is input [2,3,4,…,k] and the answer is all primes. So we get the Sieve of Eratosthenes, which works in O(n) (*logn for set/map).

»
6 months ago, hide # |
 
Vote: I like it +3 Vote: I do not like it

Absolutely GOATED contest.

Despite messing up, I loved the problems, and thanks to whoever answered the questions for not spamming "No comments" to everything(No, I was not chatting mid contest)

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

You should have made the problem rating button, E is brilliant

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

https://mirror.codeforces.com/contest/2173/submission/352285205 why is this solution accepted? if k = 1e9 and a[i] = 1 this should give TLE right?

»
6 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

can someone explain how our answer is popcount(init_n) + k — popcount(final_n).(Problem D);

»
6 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

in problem D, my $$$O(n2^{n/2})$$$ solution passed it lmao

maybe you should change the datarange to $$$n \lt 2^{64}$$$ or give the binary representation of $$$n$$$ xd

»
6 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

In problem C, can someone provide suitable explanation on why finished cannot be element of the B. Let Assume x is still left and 2*x is not possible but there exist finished y which contain x as multiple this can be used..

»
5 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

D was a great one and took a lot of time to figure out the DP approach for it, was a bit lengthy too. The problem required to maximize the no of 1's with most bit flips for K bits, We calculate the maximum gain and the most no of 1s that we can get is k + the calculated gain..

While I was even streaming the whole contest and was even sharing my approach for each problem what I felt could be the best possible solution to it, it was a private stream supposed to be public when the contest was over even I dont know how my answer matched the same logic with 4-5 other participants...

Well I would keep this in my mind next time and would try to solve more since the only thing I feel that keeps me on the backfoot is the ability to solve under time pressure, if any of you guys can help me with that it would be great. Especially for problems that involve DP and in most common words with 2d DP it takes me much more time to reach an optimal state of solution as my answer.

»
5 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

During the thinking process for E, I came up with a naive idea similar to phase 2 in the editorial without phase 1 and the submission actually passed: Submission [without symmetry]. And I also found it hard to convince myself that phase 1 is really necessary, please hack or correct me!

  • »
    »
    5 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    If you skip first phase and try to arrange pairs directly like in second phase, expected number of operations per pair becomes 5 instead of 4, but that is okay as we don't do any operations to guarantee pairs symmetry and there are n / 2 pairs.

»
5 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Another solution for E: If the prefix till L, excluded, is correct and the suffix till R=n-L+1, excluded, is correct, if we try to place L in the correct place, we can't ruin the prefix and the suffix. Let's calculate the expected number of operations in this case. T=1+0.5*0+0.5*T; T=2 (We do at least 1 operation, and if it's the wrong one, we're still expected to do T operations until the right one).

If we placed L, when we try to place R, we also can't ruin the prefix and the suffix, but we can move L to an incorrect place again. The expected number of operations in this case(if we want to not move L): T=1+0.5*0+0.5*0.5*(T+1)+0.5*0.5*(T+1); T=1+0.5(T+1); 0.5T=1.5; T=3 (We do at least 1 operation, and if it's the wrong one, after that we do either the wrong one again, cancelling it and using 1 operation, and again are expected do to another T operations, or the right one, using 1 operation, and again are expected to do another T operations, but in this case because we need to cancel the wrong one and not cancel the right one).

So for all L in total the expected number of operations is n/2*2=n, and for all R in total the expected number of operations is n/2*3=1.5n, n+1.5n=2.5n.

»
5 months ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

Sorry if this is a naive question, but regarding E, we assumed a fair probability of 0.5 for each flip. However, in practice, even after 4 or many more operations, it is possible that we still do not get the correct result. Of course, this will not happen for every n/2 pairs, but since the system tests a large number of participants and submissions, is it possible that some cases exceed the expected behavior?

For example, when tossing a fair coin, there is still a very small chance of getting tails 100 times in a row. I wonder how does the judge ensure that such extreme cases do not cause failures?

»
5 months ago, hide # |
Rev. 2  
Vote: I like it +10 Vote: I do not like it

I'm quite late, but in case it ends up being useful to anyone later: I had another $$$O(n \sqrt{n \log n})$$$ solution to F that sidesteps the precomputation in the editorial. The idea is to split the lengths into three blocks such that the first block consists of all lengths up to some $$$k_1$$$ and the second consists of all lengths between $$$k_1$$$ and some $$$k_2$$$. Then, proceed as follows:

  1. For the smallest lengths, we binary search for the last starting point for which the segment of the given length has weight at least $$$x$$$. This lets us count segments of each length in $$$O(\log n)$$$, so the complexity of this step is $$$O(k_1 \log n).$$$

  2. For the middle lengths, we repeatedly check if an interval of the current length has weight at least $$$x$$$ and add it to our answer if so. Each interval has length at least $$$k_1$$$, so there are at most $$$\frac{n}{k_1}$$$ of them. Additionally, since we check each length individually, we take $$$O(k_2)$$$ time just iterating through all the lengths. Thus, the complexity of this step is $$$O((n / k_1) + k_2).$$$

  3. Once the length is larger than $$$k_2$$$, we repeatedly binary search for the length of the next segment, as in the model solution. Since there are at most $$$n / k_2$$$ segments in this stage, the complexity of this step is $$$O((n \ k_2) \log n)$$$ (similar to the model solution).

Now, take $$$k_1 = \sqrt{n / \log n}$$$ and $$$k_2 = \sqrt{n \log n}.$$$ Then all three steps run in $$$O(n \sqrt{n \log n})$$$, as desired. My code passes in 1.5s by using $$$k_1 = 90$$$ and $$$k_2 = 1700.$$$

This solution differs from the model solution by removing the model's precomputation but adding the second step to process the larger lengths in the small group. Intuitively, we relatively quickly reach a point where the $$$n / x$$$ cost of iterating over many intervals of length $$$x$$$ is small enough that we'd rather pay it if needed than spend an extra $$$\log n$$$ factor doing binary search.

Thanks for the round!

»
4 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Can someone explain in solution D why are we adding c to bst

»
2 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Here's my understanding of the solution for Problem D.

1) We won't add where a bit is already 0. Carry is generated only when 1 interacts with 1, i.e. when $$$bit[l]=1$$$ and $$$2^l$$$ is added. Making a bit 0 to 1 wastes a move. We could have used that move to get a carry by adding at any other bit position that has 1.

2) We won't add the same $$$2^l$$$ twice. Because after one move $$$bit[l]=1$$$ to $$$bit[l]=0$$$ . And we don't add under 0, as mentioned in the point above.

3) After every move, the number of 1's either remain same or decrease. On each move, several 1's get converted to 0 and one 0 gets converted to 1. This is essential to understand popcount(n) + moves - carries = popcount(n')

4) After some moves when it reaches form $$$2^x$$$, meaning there's only one bit position has 1, remaining moves add one to the score for every move because every time we'll targets the only set bit present.

5) Since $$$n \lt 2^{30}$$$, 30 moves are enough to make the number reach form $$$2^x$$$. We can see this if we always add $$$2^l$$$ where l is the lowest set bit of the number.

6) For DP, we will ask a $$$bit[0...i]$$$ what's the max score without a carry out, and what's the max score with a carry out. Carry out can interact with next higher bit and might generate greater score.

Here's my submission

If you find anything wrong, or have any other perspective, I would love to discuss.

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

For F, you actually don't have to precompute anything apart from prefix sums. It's sufficient to do brute force with the same length idea as the editorial, but simply binary search for how many subarrays of the current length you can take, before the sum becomes too small. And you also have to binary search for the next length we take, if our current length is too small.

Then the code can be very short: https://mirror.codeforces.com/contest/2173/submission/374665396