### BledDest's blog

By BledDest, 3 years ago,

1618A - Polycarp and Sums of Subsequences

Idea: Brovko, preparation: Brovko

Tutorial
Solution (Brovko)

1618B - Missing Bigram

Idea: BledDest, preparation: awoo

Tutorial
Solution (awoo)

1618C - Paint the Array

Idea: BledDest, preparation: BledDest

Tutorial
Solution (BledDest)

1618D - Array and Operations

Idea: BledDest, preparation: BledDest

Tutorial
Solution (BledDest)

1618E - Singers' Tour

Idea: shnirelman, preparation: shnirelman

Tutorial
Solution (shnirelman)

1618F - Reverse

Idea: Lankin, preparation: Lankin

Tutorial
Solution (awoo)
Solution (BledDest)

Idea: BledDest, preparation: BledDest

Tutorial
Solution (awoo)
Solution (BledDest)
• +93

| Write comment?
 » 3 years ago, # |   +32 At the beginning of the year i became expert, hopefully at the end of the year(tomorrow) i will become expert again. Nice problemset. Thanks for fast editorial.
 » 3 years ago, # |   0 Not sure if anyone else has made this connection yet, but Problem $A$ looks very similar to Bronze Problem 1 from the 2020 December USACO competition: http://www.usaco.org/index.php?page=viewproblem2&cpid=1059
•  » » 3 years ago, # ^ |   0 Haha, I think they are the same problem in essence :p
•  » » 3 years ago, # ^ |   0 I also had the same thought, that's why I submitted A pretty quickly (I just looked up for my old submission)
•  » » 3 years ago, # ^ |   +22 Even if the problem matches I think it will take less time to solve than to search for the actual problem itself :)
•  » » 3 years ago, # ^ |   0 Yes, I have already made this connection : IMO, it's a pretty classic problem.
 » 3 years ago, # | ← Rev. 3 →   0 I solved D using Knapsack DP , I found out that last 2*k elements would be paired . So while pairing them I should try to keep elements with same value in a set , as splitting them will contribute 1 to answer , and not splitting will contribute 0 . I implementated it using Bitset Link Edit : It got hacked :((
 » 3 years ago, # |   0 Would anyone be kind enough to explain to me why these 2 submissions don't have the same result for problem e(https://mirror.codeforces.com/contest/1618/submission/139338958 https://mirror.codeforces.com/contest/1618/submission/139339631)? In the first submission I did a calculation using long long's in a cout statement, and in the second submission I swapped that with a calculation using a temp variable first then printing that variable. Is this something that I should be careful about and why does this happen? Thanks!
•  » » 3 years ago, # ^ |   +9 Inside if statement you r doing sum%n*(n+1)/2 which is equivalent to (sum%n)*(n+1)/2 . Hence WA.
 » 3 years ago, # |   +2 Why is the pairing in 1618D - Array and Operations optimal? It seems obvious but I can't find a proof for it.
•  » » 3 years ago, # ^ |   0 We can look this as an inequality. Let's suppose a >= b >= c >= d >= e >= f >= g >= h. And k=3. (it's a simplified version, but it can be generalized to any kind of array). First, we can see that the optimal solution gives \floor {d/a} + \floor {e/b} + \floor {f/c} + g + h. What will the answer become if we swap elements e and g ? It gives : \floor {d/a} + \floor {g/b} + \floor {f/c} + e + h. To prove that the latter is less than the former, we could prove that the difference between the former and the latter (former-latter) is <= 0. That brings us to prove that \floor {d/a} + \floor {e/b} + \floor {f/c} + g + h. - \floor {d/a} + \floor {g/b} + \floor {f/c} + e + h. <= 0. In other words \floor{e/b} + g — \floor{g/b} — e <= 0. Which is equivalent to (\floor{e/b} — \floor{g/b}) + (g-e) <= 0. The case e=g is trivial, suppose e > g. Than (\floor{e/b} — \floor{g/b}) <= 1 and (g-e) <= -1. Summing up these two inequalities, we obtain (\floor{e/b} — \floor{g/b}) + (g-e) <= 0, as desired.
•  » » » 3 years ago, # ^ |   0 I liked how you did it bro. How can I learn to write a proof like that?
•  » » » » 3 years ago, # ^ | ← Rev. 2 →   +3 Read other people's proofs, this is how I learned how to write.
 » 3 years ago, # |   0 I solved D using Greedy here is the link https://mirror.codeforces.com/contest/1618/submission/139346218
•  » » 3 years ago, # ^ | ← Rev. 3 →   0 Yay, I also did the same :)It counts the occurrence of each unique element and then puts it in a priority queue (we are trying to minimize the cnt of the element with the maximum cnt) so each time we will delete two elements with maximum cnt until there is only one unique element left(we do this on the last 2*k elements in sorted array).
•  » » » 3 years ago, # ^ |   0 Same here.
 » 3 years ago, # | ← Rev. 2 →   0 Can someone helps me? In 2nd problem why my code fails the test cases https://mirror.codeforces.com/contest/1618/submission/139289954
•  » » 3 years ago, # ^ | ← Rev. 2 →   0 Try out this test case1 7 bb ab bb ba abYour code will result bbabaabBut when you form Bigram from this : bb ba ab ba aa abAccording to your output 'ba' and 'aa' two are missing bigrams that's not possibleCorrect answer should be bbabbabAs bigrams formed from this are bb ba ab bb ba abCorrect me if I am wrong
•  » » » 3 years ago, # ^ |   +10 Can you help me, how you reach this test case?
•  » » » » 3 years ago, # ^ |   0 You can check my submission it's easy and simple code My Submission
 » 3 years ago, # |   0 I tried D with DP I was getting WA for testcase 2. I am not getting where I am going wrong, Please check my submission and please tell where I am going wrongSubmission Link : My Submission CodeThanks in advance for helping
•  » » 3 years ago, # ^ |   0 Spoiler1 5 2 1 5 5 4 4 Your ans : 3 Expected : 1
•  » » » 3 years ago, # ^ |   0 Yes :(Got your point , I am just checking of i+1,j-1 and i,j-2. That's mistake.Is there any way to solve this problem using dp?
 » 3 years ago, # |   0 Hi, I think I might confuse something. But in the F problem ( Reverse) how can you turn 23 (10111) to 59 (111011) ?
•  » » 3 years ago, # ^ |   +4 add 0 and reverse (10111 -> 11101) add 1 and reverse (110111) add 0 and reverse (111011)
 » 3 years ago, # |   0 I had solved problem C by taking the LCM of both GCDs and then checking if the array is divisible by the LCM for both the cases and printing the respective GCD, but the code didn't pass the test. Below is the link https://mirror.codeforces.com/contest/1618/submission/139321336 I did the same thing but this time I used GCD which passed all the tests. Below is the link — https://mirror.codeforces.com/contest/1618/submission/139323889 Can someone explain what is the difference between both the codes and why the LCM one didn't pass the test?
•  » » 3 years ago, # ^ |   +3 LCM could cross long long limit. For example LCM of 10^18-1 and 10^18 cannot fit in long long. (ai's were upto 10^18 in problem)
 » 3 years ago, # |   0 can anyone please explain the intuition behind problem C?
•  » » 3 years ago, # ^ |   +1 With practice, you will see that for these kinds it's better to evaluate all the possibilities to arrive at a conclusion. Adjacent elements needs to be colored differently...So the only two possibilities here are (even index elements colored blue and odd index elements colored red) and vice versa. Evaluate whether any of these can happen. To do so, see how can you find out a number that will divide all the numbers present at alternate indexes--->so you need to find the gcd of those numbers and then check whether the numbers at other indexes are divisible by that ...Could I make it clear ?
•  » » » 3 years ago, # ^ | ← Rev. 2 →   0 Bt how can you prove that it will be the greatest common divisor but not other any divisor?
•  » » » » 3 years ago, # ^ |   0 Because, see, if the other numbers are not divisible by GCD , then GCD is the answer. If GCD divides at least one of the numbers that is supposed not to be divisible by the GCD ,then all the factors of GCD will also divide that number. Let GCD=x, the number that it divides is y which is supposed not to be divisible by x . Now let z be a factor of x. if x divides y, then z also divides y. if any other number is there other than GCD that divides all the numbers that it is supposed to divide, then this divisor will always be a factor of GCD. So it will face the same obstacle as the GCD faces .
•  » » » » » 3 years ago, # ^ |   0 thanks
 » 3 years ago, # | ← Rev. 2 →   0 Can anyone explain what is "string(1, char('0' + i))" this line doing ??? Thanks!! This is in editorial of F.
•  » » 3 years ago, # ^ |   0 convert int 1 to char '1' then to string "1"
 » 3 years ago, # |   0 can anyone help me figure out why this program for Problem F terminates ? It passes all the test cases: Spoiler#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; const int MOD = 1e9 + 7; const ll INF = 1e18; #define ff first #define ss second #define mp make_pair #define lb lower_bound #define ub upper_bound #define setbits(x) __builtin_popcountll(x) #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define sum(x) (accumulate ((x).begin(), (x).end(), 0ll)) #define mine(x) (*min_element((x).begin(), (x).end())) #define maxe(x) (*max_element((x).begin(), (x).end())) inline void fastio() {ios_base::sync_with_stdio(false);cin.tie(NULL);} template ostream& operator<<(ostream &os, const pair &p) { return os << '(' << p.first << ", " << p.second << ')'; } template::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; } void dbg_out() { cerr << endl; } template void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); } #ifndef ONLINE_JUDGE #define dbg(...) cerr << "[" << #__VA_ARGS__ << "]:", dbg_out(__VA_ARGS__) #else #define dbg(...) #endif mt19937 rng((unsigned int)chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r){ uniform_int_distribution uid(l, r); return uid(rng); } // memset (name, value, sizeof(name)) // replace (list.begin(), list.end(), value1, value2) // unique (list.begin(), list.end()) // remove (list.begin(), list.end(), value) // lower_bound(list.begin(), list.end(), value) -> first element >= value // upper_bound(list.begin(), list.end(), value) -> first element > value ll binrev(ll x) { vector bits; for(int i = 0; i < 63; i++) { if ((1LL << i) & x) { bits.push_back(1); } else { bits.push_back(0); } } while(!bits.empty() && bits.back() == 0) { bits.pop_back(); } reverse(all(bits)); ll xp {}; for(int i = 0; i < sz(bits); i++) { if (bits[i]) { xp += (1LL << i); } } return xp; } map, bool> m; bool f(ll x, ll y) { if (x == y) return true; if (m.find(mp(x, y)) != m.end()) { return false; } m[mp(x, y)] = true; // either perform operation 1 or operation 2 ll x1 = binrev(2 * x); ll x2 = binrev(2 * x + 1); bool res = f(x1, y) || f(x2, y); return res; } void solve() { ll x, y; cin >> x >> y; cout << (f(x, y) ? "YES" : "NO") << '\n'; } int main() { fastio(); #ifdef devansh_local auto begin = std::chrono::high_resolution_clock::now(); #endif cout << setprecision(15) << fixed; int tc = 1; while(tc--) { solve(); } #ifdef devansh_local auto end = std::chrono::high_resolution_clock::now(); cerr << "Execution time: " << std::chrono::duration_cast(end - begin).count() << " ms" << endl; #endif return 0; } 
 » 3 years ago, # |   0 Stupid question about Problem C:I'm trying to understand this line of code:--> good[i % 2] = good[i % 2] && (a[i] % g[(i % 2) ^ 1] > 0);Specifically this part:--> && (a[i] % g[(i % 2) ^ 1] > 0);What's the purpose of the XOR here?Same question about this line:--> ans = max(ans, g[i ^ 1]);
•  » » 3 years ago, # ^ |   0 XOR flips the values from 0 to 1 and vice versa.
•  » » 3 years ago, # ^ |   0 You need to use Markdown in the code(like good[i % 2] = good[i % 2] && (a[i] % g[(i % 2) ^ 1] > 0);.
• »
»
»
3 years ago, # ^ |
Rev. 2   0

Just testing...

Test of code formatting

int i = 0, x = 0;
while (i < 100) x++;
cout << x;


---

---

## test of italics

•  » » » » 3 years ago, # ^ | ← Rev. 3 →   0 Stop useless posts/comments!
 » 3 years ago, # |   +7 good contest but it need to strong pretest cases in problem d and f finally i realy sorry for every one get wrong answer in d test 25 i put it in hacks , i tried to cover corner case not to hack some one
 » 3 years ago, # |   0 If possible, add graphs tag to problem F.
 » 3 years ago, # | ← Rev. 3 →   0 In problem G can someone clarify how to use DSU to reach the solution. I understand the creation of graph but am unclear on how to use DSU.
•  » » 3 years ago, # ^ |   0 I didn't use graph or DSU. It's just interval merging.
•  » » » 3 years ago, # ^ | ← Rev. 2 →   0 Can you please explain basic idea of your solution, I mean just a walkover. Thanks in advance.P.S: I could see your code but I don't want to as I want to code it on my own after knowing the basic idea you have implemented in your solution.
•  » » » » 3 years ago, # ^ |   0 First combine array A and B as a new array v, then sort it. what you need to calculate is the sum of maximal x values of each interval [i, j] where v[l] + k <= v[l + 1] (i <= l < j). So, initially you have n intervals, [1,1], [2,2], ... , [n, n] where n = v.size(). For each given k in increasing order, find out all i satisfying v[i] + k <= v[i + 1] (from a pre-sorted array). Merge the interval end at i and the interval start at i + 1. I used two arrays left and right to store intervals. use prefix sum array to calculate the number of elements coming from array A between [i, j] in O(1), then use another prefix sum array to calculate the sum of maximal x values of [i, j] in O(1). You can check my last AC code.
 » 3 years ago, # |   0 https://mirror.codeforces.com/contest/1618/submission/139274778 this my code of E question and I just got msg that my code is significantly match with this code https://mirror.codeforces.com/contest/1618/submission/139261121. please can anyone look into this because both codes are not same and I haven't done any unfair mean, you can also look into my profile.
•  » » 3 years ago, # ^ |   0 Yes, both codes are very different... Surprised how they are significantly matching.
 » 3 years ago, # | ← Rev. 2 →   0 Hey Everyone Can anybody tell me how 'testcase: 1 576460752303423487' for problem F gives YES According to me if x = 1. You can change it to only 111...(any no of times) but in this testcase, you can change it to 10000..(58 times). But How?
•  » » 3 years ago, # ^ |   0 576460752303423487 is 11...11 (59 times)
•  » » 3 years ago, # ^ |   0 Binary for 576460752303423487 is "11111111111111111111111111111111111111111111111111111111111". So we can change 1 to 576460752303423487.So it gives "Yes".
»
3 years ago, # |
Rev. 2   -6

## Can Somebody help with problem C my code was giving me TLE but I think its logic is similar to the solution?

#include <bits/stdc++.h>
#define ll int
#define pb push_back
#define ld long double

using namespace std;

//Global variables
ll t, n, k, m;
const ll template_size = 100002;
//template arrays
// ll a[template_size] = {};
// ll b[template_size] = {};
// ll dp[template_size] = {};

int main()
{
//makes the io faster
ios::sync_with_stdio(0);
cin.tie(0);

t = 1;
cin >> t;
while (t--)
{
cin >> n;
vector<ll> a(n,0);
ll ge,  go;
cin >> a[0];
cin >> a[1];
ge = a[0];
go = a[1];
for (int i{2}; i < n; i++){
cin >> a[i];
if (i%2 == 0){
ge = __gcd(ge, a[i]);
}
if (i%2 != 0){
go = __gcd(go, a[i]);
}
}
// if (ge == go){
// 	cout << 0 << '\n';
// 	continue;
// }
ll ans{0};
bool flag1 = true, flag2 = true;
for(int i{}; i < n; i++){
if (i%2 == 0){
flag1 = flag1 & (a[i]%go != 0);
}
else {
flag2 = flag2 & (a[i]%ge != 0);
}
}

if (flag2){
ans = max(ans, ge);
}
if (flag1){
ans = max(ans, go);
}
cout << ans << '\n';
}

return 0;
}

•  » » 3 years ago, # ^ |   0 You need to use Markdown in your code(the first 7 lines).
 » 3 years ago, # | ← Rev. 3 →   +9 1) In problem G, what is the proof that the rebalancing step in the unite function (i.e. while (*bst[a].begin() < *wst[a].rbegin())) won't take too long in total?2) In problem D, how to prove that the answer is: $(\sum_{i = 2k}^{n}a_i) - max(0, f - k)$after sorting the array in non-increasing order? (I got AC with it and it seemed very intuitive)$f$ is the frequency of the most repeated element in $a[1..2k]$.
•  » » 3 years ago, # ^ |   +3 the first one only runs n — 1 times, as there is only n — 1 segment and each one will be accessed only once.
•  » » » 3 years ago, # ^ |   0 Oh, I see. If I understood correctly, we are only increasing stuff, and we can do so at most $O(n)$ times.
•  » » » » 3 years ago, # ^ |   0 yes.
•  » » 3 years ago, # ^ |   0 Regarding your second question, I had the same observation. This is my informal logic. We know that we are going to remove the first 2k elements when the array is sorted in non-increasing order. For each pair we remove, as long as the two elements are different, we can guarantee that they won't add anything to the score. Therefore, we are only concerned with pairs with two identical elements. We want to minimize those pairs in order to minimize the score. After some analysis, we can see that only the most repeated element in a[1...2k] matters. Consider the expression 2k — max_dupes, where max_dupes is the frequency of the most repeated element x in a[1...2k]. 2k — max_dupes represents the number of elements that are different from x, therefore, 2k — max_dupes operations will add nothing to the score. The remaining number of operations, which are unavoidable, will each add 1 to the score (bc numerator = denominator), which results in the expression k — (2k — max_dupes) = max_dupes — k. This equals the extra score added to the remaining sum of a[2k+1...n]. If max_dupes — k is <= 0, we know that there are no unavoidable pairs with two identical elements therefore we add max(0, max_dupes — k).
 » 3 years ago, # |   0 Can someone help me? In problem F, I do not know why my code fails. Thanks a lot.https://mirror.codeforces.com/contest/1618/submission/139439943
•  » » 3 years ago, # ^ | ← Rev. 2 →   +1 Hi, I think you have to change 18 to 63 because we want to convert x and y to binary numbers and they are up to 10 ^ 18 which means their binary representation has up to 63 bits.
 » 3 years ago, # |   0 what means g[(i % 2) ^ 1] ?
•  » » 3 years ago, # ^ |   0 You can see this comment.
 » 3 years ago, # | ← Rev. 3 →   0 There's an even simpler solution for D. First of all, you greedly add the first n — 2k numbers (after sorting of course), then, for the rest of the numbers, you check how many times each number appears. If there's a number that appears more than k times, then you know that there's no avoiding in adding one to the answer; you simply add the amount it appears — k to the answer.139271250
 » 3 years ago, # |   0 Can anyone tell me what is the time complexity of the second solution of problem F?
 » 3 years ago, # |   0 For E, could you use FFT? I see a system of linear equations, and the resulting matrix is circulant. Hence, you could use a FFT and solve it in nlogn time. It's slower than the accepted solution, however. Still would be interesting to do.
•  » » 14 months ago, # ^ |   0 Hey man, I thought of solving a system of linear equations as well, I ended up writing about my solution and just saw your comment. Here's it: https://mirror.codeforces.com/blog/entry/97927?#comment-1035215It is not FFT unfortunately, but it is linear time
 » 3 years ago, # |   0 Instead of pairing up the last 2k numbers like described in the tutorial for problem D, is it possible to just run the following O(n^2) algorithm: For each i in the range [n — 2k + 1, n — 1] we will look for the smallest index j such that arr[i] < arr[j] and then set arr[i] and arr[j] to -1 so that they aren't used anymore. And if we can't find any index j that works, just look for the smallest index j such that arr[i] = arr[j]. Then you just increase answer by 1 and once again set arr[i] and arr[j] to be -1. Finally, add the first n — 2k numbers to the answer as described in the tutorial.My submission implements this algorithm and didn't pass, so I am wondering if there are any edge cases that break my O(n^2) algorithm. Here is my submission, just in case it is needed.143369978
 » 14 months ago, # | ← Rev. 2 →   0 Here is a very interesting way to do E through solving a system of equations. Firstly, it is very easy to transcribe the problem into a system of equations. For example, when $n=3$, we have:$1a_1 + 3a_2 + 2a_3 = b_1$$2a_2 + 1a_2 + 3a_3 = b_2$$3a_1 + 2a_2 + 1a_3 = b_3$I chose to solve the systems using the inverse matrix method. In this method the goal is to calculate the inverse matrix of the system and multiply it by the constant vector ($b$) to get the solution vector.Of course, calculating the inverse of our matrix is too computationally expensive, but due to the patterns exhibited on our matrix, the inverse matrix will also show some patterns.After some experimentation with web tools to calculate some inverse matrices, I came to the conclusion that the inverse matrix for matrices derived from this problem: Are composed of one single row that is cyclically shifted to the right to form subsequent rows Have only 3 unique cell values, all 3 of which can be represented as fractions with equal denominators In the first row, the middle $n-2$ cells have a numerator of $1$ The first element of the first row has a negative numerator The last element of the first row has a positive numerator. Furthermore, each of the 3 unique cell values exhibit a pattern of their own as $n$ varies: The common denominator is the $n$-th pentagonal pyramidal number. The negative numerator follows the sequence $0, -2, -5, -9, ...$ The positive numerator follows the sequence $2, 4, 7, 11, ...$ We now have enough knowledge to generate the inverse matrix of our system of equations very quickly. By taking advantage of the pattern in each row (noted previously), we can calculate the product of our inverse matrix with the constant vector in $O(n)$ time through a sliding window method.Here is the final solution: https://mirror.codeforces.com/contest/1618/submission/208803182While this solution is interesting, it's biggest crutch is that my observations for the inverse matrix would have to be correct for all $n$. I have very little experience in this area so all I could do is hope for the best. I would love to hear some rationales from some people who are more experienced in this area!
 » 4 months ago, # |   0 Can We Solve Problem D Using Dynamic Programming?