### vovuh's blog

By vovuh, history, 4 years ago,

1256A - Payment Without Change

Idea: MikeMirzayanov

Tutorial
Solution

1256B - Minimize the Permutation

Idea: vovuh

Tutorial
Solution

1256C - Platforms Jumping

Idea: MikeMirzayanov

Tutorial
Solution

1256D - Binary String Minimizing

Idea: MikeMirzayanov

Tutorial
Solution

1256E - Yet Another Division Into Teams

Idea: MikeMirzayanov

Tutorial
Solution

1256F - Equalizing Two Strings

Idea: vovuh

Tutorial
Solution
• +41

| Write comment?
 » 4 years ago, # |   +9 For Problem C,I imimplemented in O(n). 64249894Main idea is like the tutorial:First place the platform as rightmost as we can ,if the rest positions can't place later platforms,we need move current platform to left.Maybe I am lucky enough to pass all tests.
 » 4 years ago, # |   +34 Very Greedy Contest.
 » 4 years ago, # |   +1 C in O(n). It's just placing the platforms leftmost you can at first. Got hacked for a simple mistake unfortunately. here 64283716
 » 4 years ago, # | ← Rev. 6 →   +3 My solution for C is very simple $O(n)$ 64233289 Idea is following: Set positions of all platforms with space in between exactly $d-1$. Just don't care about width of river. Now, if beginning of next "virtual" platform is $n+1$ or greater, then answer is YES otherwise is NO. Last step, we need to pack all platforms back into river. It's very easy to do. Let $n+1$ to be beginning of "virtual" platform, now iterate over all platforms from the last to the first, and if the platform overlap "virtual" platform, them align end of the platform to beginning of virtual platform. Now, set virtual platform to be this aligned (or not) platform and continue.
•  » » 4 years ago, # ^ |   0 This is awesome, thank you!
•  » » 4 years ago, # ^ |   -6 This is Python, Python is a very dangerous language, none of my colleagues think well of it
•  » » » 4 years ago, # ^ |   0 Python is so dangerous that it will kill you at night
•  » » » » 3 years ago, # ^ |   0 No risk no fun
•  » » 3 years ago, # ^ |   0 Can you explain the last step more elaborately?
•  » » » 3 years ago, # ^ |   0 I'll provide example. If n = 17 and last platform after first step is starting from position 20 and has width 4, then its last position where you could stand is 22, and it much greater than start of virtual platform at 17+1. So you need to align it so last position where you could stand on this platform is 17 (right next to virtual platform). Because it has width 4 then you need to put it at position 14. Now this is new virtual platform. Suppose platform before it is at position 12 and width 7. Then its last position where you could stand is 18. It's greater than 13, so you need to align it so it would end at 13. You move it to position 7.
•  » » » » 3 years ago, # ^ |   0 Great Explantion. Are you open to mentoring people?
•  » » » » » 3 years ago, # ^ |   0 you don't need mentor if you follow this short guide https://codeforces.com/blog/entry/80268#comment-664467I'm open to answering questions, but only if I have spare time.
 » 4 years ago, # | ← Rev. 2 →   +10 I think there is missing part of editorial for F.Regarding case when all characters in both strings are distinct. Suppose that there is way to make them equal. It means, that if you apply all operations for first string instead of doing them simultaneously, and then apply all operations on the first string that was supposed for the second string in reverse order, you should get second string. In other words, steps to make the second string from the first string is: operations of first string in normal order plus operations on second string in reverse order. But count operations of same length is even, because each simultaneous operation produce two operation of same length. Thus, you need to change parity even times, which means no parity change is possible.What I don't understand though, is how you can prove that you always can do that when parity is same. All I did is prove that you can't make it if parity is different.
•  » » 4 years ago, # ^ |   +6 If the parity is the same, you can always do a swap twice in the same position in one string (making a no-op), while making two arbitrary swaps in the other.
•  » » 4 years ago, # ^ |   0 actually we can run a bubble sort algorithm in the case of distinct characters and count how many swap you needed to do. Let's say swap counts are p and q. if p and q has same parity, then we can perform (p -q) operation extra in the first string(let's say p > q). and we would do every operation twice in an interval to make the sorted string unchanged. if we have same parity, we can do that. else, we can't as we need to perform one last operation only once and that would change the sorted string.Sorry for my poor english.
•  » » » 4 years ago, # ^ |   0 Parity of swap count is changing. I didn't got this task during contest only because of that. After contest I've changed swaps count into inversions count and got AC. So, something is tricky there about it.
•  » » » » 4 years ago, # ^ |   0 Every swap changes the number of inversions by one. So they have same parity.
•  » » » » » 4 years ago, # ^ |   0 Oh! Thanks, indeed. I found mistake. It was == 64254819 instead of = 64352150. So, I lost AC just because of that :)
•  » » » 4 years ago, # ^ |   0 Thank you for sharing~
 » 4 years ago, # |   +2 In problem E, Why the maximum size of a team is 5??
•  » » 4 years ago, # ^ |   +13 For example，after sort we have a team: a1 a2 a3 a4 a5 a6if divide them in one team the diff is a6-a1if we divide them in two team the diff is a3-a1 + a6-a4as you know,a3<=a4 so the later diff is better.
•  » » 4 years ago, # ^ |   0 if team size is 6 then you can split it into two. Thus minimize the ans.
 » 4 years ago, # |   +2 it's hard to see when you have 11 correct hacks ( for the first time ) but still no hacking leaderboard vovuh
 » 4 years ago, # |   0 from the solution of[problem:1256D] problem D can anyone explain what we do if s[i]=='0' but k
•  » » 4 years ago, # ^ |   0 We will move the zero to the left as far as possible. Briefly we will swap it with the character to the left k times.
•  » » 4 years ago, # ^ |   0 what does cnt denote ?
 » 4 years ago, # |   0 For question A, why do we need to do S % n? I mean what would we get by doing this? I know it would be quite basic but still, I didn't get it. Thanks in advance
•  » » 4 years ago, # ^ |   0 $S\ \%\ n$ = the amount of 1-value coins you need to get the exact number. Like, imagine if $S = 54$ and $n = 10$, that's like needing to make 54 cents out of 10-cent coins; you can't unless you have at least 4 1-cent coins.
•  » » » 3 years ago, # ^ |   0 Why shouldn't we must be having atleast s/n coins of type 'n' also a condition?
•  » » » » 3 years ago, # ^ |   0 Because you can always replace one $n$-value coin with $n$ one-value coins, so long as you have enough money in the first place.
 » 4 years ago, # |   0 I can't understand Then let's sort the second string also by swapping adjacent characters but choose the pair of adjacent equal characters in the first string (it always exists because the first string is already sorted). for problem F.
 » 4 years ago, # |   0 You can solve E with segment tree & DP,but just DP solution is way more easier.
 » 4 years ago, # |   0 I think Problem B can be solved in $O(n)$, it's too late at night to code it though
•  » » 4 years ago, # ^ | ← Rev. 8 →   0 Here's my code for $O(n)$: 64340316 ExplanationThe bottleneck is finding the minimum index of some suffix of the array. Since we are modifying the array during the operations, this might suggest some sophisticated data structure like a TreeMap or a segment tree, but the key observation is that we're only querying for the unmodified suffix of the array, so we can just precalculate the suffix minimum indices in $O(n)$ time...Well, almost unmodified. When we find a minimum number at index $j$ and move it towards the front, index $P_j$ changes (the value at $P_{j-1}$ is "pushed up" to it), but is also part of the suffix we want to query in the next iteration. However, since this is only one index, we can either update the precomputed array at that index, or do a single comparison between the new value and the minimum of the unmodified suffix right after it
 » 4 years ago, # |   0 Here is O(n) solution for problem C: 64232235 ApproachPlace all the platforms stacked to the left, then starting from the end move each platform to as far as possible from the next platform (added platform for n+1). Then check if it is possible to reach the first platform from 0, if not then it is not possible.
 » 4 years ago, # | ← Rev. 2 →   0 $O(n)$ solution for C: I didn't put the board greedily. I tried to break the gaps between the boards evenly.My Submission: 64221433
 » 4 years ago, # | ← Rev. 2 →   0 In problem F, How does one get an idea to consider the parity of inversions ? I mean it is not at all obvious to me . If this is a popular idea , can someone give some problems related to it ?
•  » » 3 years ago, # ^ | ← Rev. 2 →   +3 Yes, it is a well-known trick. You should definitely learn it.986B - Petr and Permutations A very nice problem
 » 4 years ago, # |   0 In problem E , how would we approach if we have to minimise the number of teams as well?
•  » » 4 years ago, # ^ |   0 You would combine all consecutive teams into one team where it does not make a difference in the diversity. ie the ones where the score of the highest member of the team is one less than the score of the lowest member of the next team.
 » 4 years ago, # |   0 In problem E. help help me... My code is a little different from the offcial solution, but I think they are roughyly the same. However, it is TLE. Here is the central part of my code.for(int i = 2; i < min(5, n); i++) { dp[i].first = wd[i].first — wd[0].first; dp[i].second = i + 1; } int len = 0;int temp = 0; for (int i = 5; i < n; i++) { if(dp[i - 3].first + wd[i].first - wd[i - 2].first < dp[i - 4].first + wd[i].first - wd[i - 3].first) { len = 3; temp = dp[i - 3].first + wd[i].first - wd[i - 2].first;} else { len = 4; temp = dp[i - 4].first + wd[i].first - wd[i - 3].first;} if(temp > dp[i - 5].first + wd[i].first - wd[i - 4].first) { len = 5; temp = dp[i - 5].first + wd[i].first - wd[i - 4].first;} dp[i].first = temp; dp[i].second = len; }
 » 4 years ago, # |   0 I got a detailed prove for F. Regarding　case where the characters of both string are distinct. let's consider the pair in string a, a(i) > a(j) and i
 » 4 years ago, # | ← Rev. 3 →   0 for the problem B the first testcase is $[5 4 1 3 2]$My approach is: $[5, 4, 1, 3, 2]$ $[5, 1, 4, 3, 2]$ $[1, 5, 4, 3, 2]$ $[1, 5, 3, 4, 2]$ $[1, 3, 5, 4, 2]$and the answer is [1, 5, 2, 4, 3], but clearly my answer is lexicograhically smaller, so anyone can tell me where is the problem?
•  » » 4 years ago, # ^ |   0 It is mentioned that for a particular index i you can swap only once. For i=2 you can swap (4,1) after that you cannot swap number at position i=2. i.e.(5,3)Second paragraph of question: " You can perform at most n−1 operations with the given permutation (it is possible that you don't perform any operations at all). The i-th operation allows you to swap elements of the given permutation on positions i and i+1. Each operation can be performed at most once. The operations can be performed in arbitrary order. "
•  » » » 4 years ago, # ^ |   0 I see，thanks！
 » 4 years ago, # | ← Rev. 3 →   0 a more general solution for E: sort by skill let dp[i] = minimum diversity that we can do starting at index i then dp[i] = min(dp[k+1] + a[k] − a[i]) for all k, such that i + 2 <= k <= n − 4 since a[i] is independent of k, dp[i] = − a[i] + min(dp[k+1] + a[k]) for all k, such that i + 2 <= k <= n − 4 if we want to implement this it would take o(n^2), but we can notice something by looking at dp[i + 1]dp[i+1] = − a[i + 1] + min(dp[k + 1] + a[k]) for all k such that i + 3 <= k <= n − 4thus dp[i] = − a[i] + min(a[i + 1] + dp[i + 1], a[i + 2] + dp[i + 3])the idea is that dp[i+1] would already have the minimum for all k >= i + 3, so we only need to test for k = i + 2 and then compare it with dp[i +1] + a[i + 1]
 » 4 years ago, # |   0 Can someone explain why my solution failed on test case 2? https://codeforces.com/contest/1256/submission/65338281
 » 3 years ago, # | ← Rev. 2 →   0 In problem B why i can't start by swapping 1 to arrive to the beginning of array then swap 2 to the nearest index can be reached then 3 and so on... Why i have to move the largest element to the end of array starting with (n-1)th (move if i can) and finish with 1st element.What is the difference between tow processes.
 » 3 years ago, # | ← Rev. 2 →   0 How is my naive dp solution of time complexity O(nmd) (approx 10^9 operations) passing all test cases of problem C ? 70828229
 » 3 years ago, # |   0 Can anyone tell me how is problem B different from problem D? I mean, aren't just we minimizing the given sequence in both of the problems?For problem B, all I did was to first loop through the array from right to left (from n-2 to 0) swapping all elements where, a[i] > a[i+1], and then, once again from left to right (from 0 to n-2), doing the same operation, but making sure that the "i" was not repeated when going through the loop the second time, this can be done by maintaining a map.However, this approach for problem D turned out to be wrong when I ran it on my local machine, is it because of the restriction of "k" ?Sorry for my bad English.
 » 3 years ago, # |   0 Problem C is can be done in O(n) and without needing terrible implementation, here is my submission 83591516 , just think about gaps, there are n-(summation of all plank lengths) gaps, and places=m+1 positions to fill them ( each side of a plank), now lets say we are going to place k=gaps/places zeroes contigously, we need to take care of rem gaps%places as well...
 » 3 years ago, # |   0 in editorial it says dp for E is so standard tho i can't understand it :||
 » 3 years ago, # | ← Rev. 2 →   0 Hello, in solution of problem D , i dont got why we do res += s.substr(i + 1);. Can someone explain it to me pls ? :D Edit : i think i got it
•  » » 9 months ago, # ^ |   0 we are adding the left over portion in this the number of operations that are available are less then we have to do for this we will increase the position of 1 this will reduce the number of operations so therefore first we will add the extra number of operations that is cnt-k and after that we will add one zero . this zero is automatically get added to the most optimal position and after that we will add k ones