### awoo's blog

By awoo, history, 10 months ago,

1861A - Prime Deletion

Idea: BledDest

Tutorial
Solution (BledDest)

1861B - Two Binary Strings

Idea: Roms

Tutorial
Solution (Roms)

1861C - Queries for the Array

Idea: BledDest

Tutorial
Solution 1 (Roms)
Solution 2 (BledDest)

1861D - Sorting By Multiplication

Idea: Roms

Tutorial
Solution (Roms)

1861E - Non-Intersecting Subpermutations

Idea: BledDest

Tutorial
Solution (BledDest)

1861F - Four Suits

Idea: BledDest

Tutorial
Solution (BledDest)
• +119

 » 10 months ago, # | ← Rev. 3 →   +27 These solutions explain very clearly.I'm sad I didn't AC problem D, but it is interesting!
 » 10 months ago, # |   +15 thanks for the tutorial
 » 10 months ago, # |   +12 Good problems, thanks for the round!
 » 10 months ago, # | ← Rev. 2 →   +15 "BledDest is a graph theory lunatic" had me cracked up.
•  » » 10 months ago, # ^ |   +15 The point is that the sentence's coming from himself.
 » 10 months ago, # |   +8 Test 3,682nd test case->great work in testing!
 » 10 months ago, # |   +13 D was looking hard but it is easy
 » 10 months ago, # |   +8 Another easy way to implement E is to just combine the last two states into one. So $dp_{i,j}$ counts how many of arrays of length $i$ exist such that the number of elements on the suffix we use is $x \equiv j \pmod k$ and the current cost of the array is $c = j\ /\ k$. Then the transitions are the same, but you just reset the partial sum whenever $j \equiv 0 \pmod k$ since you can never transition to a lower cost.Submission: 221342327
•  » » 10 months ago, # ^ |   +5 Thanks this is really helpful
 » 10 months ago, # | ← Rev. 2 →   0 In problem C, if you have : ++++1-0 when we verify the number elements in the array we have 3 elements but the array has to be sorted.Edit : I misunderstood the second condition
 » 10 months ago, # |   0 during contest i had some trouble implementing C (i had same idea as described in approach 1) and using segment trees seemed easier to me. Idea is identical as described in approach 1 but it was easier for me to implement this way, so i thought of sharing it: code.
 » 10 months ago, # |   -19 #include using namespace std; #define all(v) (v).begin(), (v).end() void solve(); signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.setf(ios::fixed); cout.precision(10); srand(time(NULL)); long long t; cin >> t; while (t--) { solve(); } } void solve() { string s; cin >> s; long long n = s.length(); if (n == 1) { if (s[0] == '0' || s[0] == '-') cout << "NO" << endl; else cout << "YES" << endl; return; } long long flag0 = 0; long long flag1 = 1; long long count = 0; for (long long i = 0; i < n; i++) { if (s[i] == '+') { if (flag0 > 0) flag0++; flag1 = 0; count++; } else if (s[i] == '-') { count--; flag0 = max(0LL, flag0 - 1); } if (s[i] == '0') { if (count <= 1 || flag1) { cout << "NO" << endl; return; } if (flag0 == 0) flag0 = 1; } if (s[i] == '1') { if (flag0) { cout << "NO" << endl; return; } flag1 = 1; } } cout << "YES" << endl; } Can anyone tell me what is wrong with this solution to problem C. Thank you in advance
 » 10 months ago, # |   0 Hi all, it would really help if you can post some insights/hints for the problems of this contest on https://starlightps.org ! Here's a link to the problems: https://starlightps.org/problems/collection/cf-edu-154/. This will help us get more data so users can have a platform to: share/discover hints/insights on various problems find similar problems given insights they struggled with. Check it out if you're interested. Thanks!
 » 10 months ago, # | ← Rev. 2 →   -11 void solve() { str s; cin >> s; stack st; int nz = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == '+') { st.push(s[i]); } else if (s[i] == '-') { if (st.empty()) { cout << "NO" << endl; return; } else { if (st.top() == '1' || st.top() == '0') { if (st.top() == '0') nz--; st.pop(); st.pop(); } else st.pop(); } } else { if (st.size() < 2) { if (s[i] == '0') { cout << "NO" << endl; return; } } else { if ((st.top() == '1' && s[i] == '0') || (st.top() == '0' && s[i] == '1')) { cout << "NO" << endl; return; } if (s[i] == '1' && nz != 0) { cout << i << " " << "hello" << endl; cout << "NO" << endl; return; } if (s[i] == '0') { nz++; } if (st.top() == '+') st.push(s[i]); } } } cout << "YES" << endl; } what is the error in this code, getting WA in test 3, for problem C. I have used a stack-based approach.
 » 10 months ago, # |   0 Can someone find out what is wrong with my code problem c 221486376
•  » » 10 months ago, # ^ |   0 Take a look at Ticket 17062 from CF Stress for a counter example.
 » 10 months ago, # |   0 Kevin114514 , How can you make A this much complicated ? His submission (221392540)
 » 10 months ago, # | ← Rev. 2 →   +6 awoo,BledDest I think in tutorial of problem E, in the paragraph before the last, you should have written: "difference is: $dp_{i,j,c}$", instead of $dp_{i,j+1,c}$because we have according to the second type of transitions$dp_{i+1,j} <== d_{i,j} + d_{i,j+1} + ... + dp_{i,k-1}$$dp_{i+1,j+1} <== d_{i,j+1} + d_{i,j+2} + ... + dp_{i,k-1}$difference: $dp_{i+1,j}-dp_{i+1,j+1} = dp_{i,j}$ and not $dp_{i,j+1}$I hope I'm not mistaking, but correct me if I'm wrong...thx
•  » » 10 months ago, # ^ |   +4 Thank you, this is an error. Will be fixed in a couple of minutes
 » 10 months ago, # |   0 woww clear editorial , tnx awoo , BledDest
 » 10 months ago, # |   0 at problem B wouldnt the example a = 00010000 b = 00011111 give a no?
•  » » 10 months ago, # ^ |   0 ignore the question I didnt read that it ends with 1 and starts with 0
 » 10 months ago, # |   0 thank you for the editorial It was really helpful, I have a question How on earth did you come up with that idea of the last x elements on problem E, You assumed some number and built the dp table on the assumed number, it is my first time to see such a thing I Don't think this sort of things come from practice, and the amazing thing is that most of accepted solutions are the same idea, Is that I'm too dump or you are too smart? Thank You :D
 » 10 months ago, # |   0 Why you most of the times post the editorial late, it is expected that you should post the editorial as soon as the hacking phase in over.
 » 10 months ago, # | ← Rev. 2 →   0 The title for D in the tutuorial text is Russian, not English. awoo fix it pls, thx
 » 10 months ago, # |   0 Roms very clean and readable code. Thanks.
 » 10 months ago, # |   0 Hey Author, I am in trouble to get the Problem B according to me for the test case 1 1000101 1000100 I am not able to find the way to make this same : ( but according to the Author code it is printed YES Can anyone know how to make this equal ??
•  » » 10 months ago, # ^ |   +4 According to the question .. both the strings should start with 0 and end with 1's. So your test case is wrong.
 » 10 months ago, # |   0 What's wrong with this solution for C?
•  » » 10 months ago, # ^ | ← Rev. 2 →   0 In your code dealing with '-' : if (!unsorted.empty() && elements < unsorted.back()) unsorted.pop_back(); IF shoule be replaced by WHLIE , for the cases like this : ++++000-1 , you need to pop back more than once.Then your code will get accepted. :)
•  » » » 10 months ago, # ^ |   0 Thanks!
 » 10 months ago, # |   0 Any one could help me I don't know what is the wrong in this solution
•  » » 10 months ago, # ^ | ← Rev. 2 →   +1 1++++1-0
•  » » » 10 months ago, # ^ |   0 thanks
 » 10 months ago, # |   0 Can someone please explain, what is the partial sum technique mentioned in E and why is it true?
 » 10 months ago, # | ← Rev. 6 →   0 For problem D can someone explain how can this be sorted in 4 operations? n = 9, a = [10 5 10 9 6 9 8 9 5]
•  » » 10 months ago, # ^ | ← Rev. 2 →   0 l=1,r=2,x=3 30 15 10 9 6 9 8 9 5 l=1,r=4,x=-1 -30 -15 -10 -9 6 9 8 9 5 l=7,r=8,x=2 -30 -15 -10 -9 6 9 16 18 5 l=9,r=9,x=4 -30 -15 -10 -9 6 9 16 18 20 
•  » » » 10 months ago, # ^ |   0 Thanks
 » 10 months ago, # |   0 Problem C Approach 1(Roms) Can anyone explain why we need to check it after each query? After each query, we can just check that the longest sorted prefix is shorter than the shortest non-sorted prefix
•  » » 10 months ago, # ^ |   0 If the current query is '1', then make longest sorted prefix equal current length, which is consistent with the current query. And the shortest non-sorted prefix is consistent with the previous queries. If longest sorted prefix is shorter than the shortest non-sorted prefix, it means the current query is valid based on the previous queries.If the current query is '0', then make shortest non-sorted prefix=min(shortest non-sorted prefix, cur_length), which is consistent with the current query. Then check the inequality.
•  » » » 10 months ago, # ^ |   0 thanks
 » 10 months ago, # |   0 Seems like this editorial doesn't explain why there is no better solution in problem D, which makes prefix with length x negative by several multiplications on negative number
•  » » 10 months ago, # ^ | ← Rev. 4 →   0 HELP, Can anyone prove the solution to Problem D. Why does this approach give an optimal solution? Thanks.
 » 10 months ago, # |   +1 Why Was My Submission Skipped Despite Submitting First https://codeforces.com/blog/entry/120756
 » 10 months ago, # |   0 Can anyone help me in which test case is this solution going wrong it shows WA on 303 (test case 3)
 » 9 months ago, # |   0 I have an easier solution for E.We can use dp in one dimension. Dp[i] means how many arrays with length i has the subarray from i-k+1 to i, which contains integers 1~k. Fac[i] means the factorial from 1 to i. Pw[i] means the i-th power of k.Every time, dpi has initial value fac[k] * pw[i-k]， because we chose number from 1~k optionally to fill the position 1 ~ i-k+1, and from 1-k+1 to i, the ways is equal to an arrangement of 1~k.But this may cause duplication, for example. n = 4, k = 3 and for the array 1 2 3 1, we will calculate the contribution in both dp[3] and dp[4], but the cost of this array is 1. To solve this, when we calculate dp[i], we need to minus dp[j] which j is from i — k + 1 to i — 1. Actually we need to minus dp[j] * fac[i-j] because dp[j] only caluculate array of length j. From the position j+1 to i, the ways we fill it is equal to an arrangement of 1~i-j.Submission: Code
•  » » 7 months ago, # ^ | ← Rev. 2 →   0 Your solution is brilliant, although I don't know why the answer is sum of all dp[i] * Pow(k, n — i). It looks like taking any possible from the rest n — i elements, but it will be confused, as I don't know whether there is any duplication or not. Could you explain this part?
 » 8 months ago, # |   +1 In the BledDest approach for problem C, specifically in this line: "In terms of our tree, it means that a vertex marked with 0 has an ancestor (possibly itself) marked with 1." Shouldn't it be the other way? find a vertex marked with 1 that has an ancestor marked with 0?
 » 5 months ago, # |   0 For C, what about the condition where something that is unsorted, is a prefix of something that's unsorted? Isn't that an automatic 'NO' as well? For example, we have a 1, then we delete some characters without adding any, then we have a 0. That couldn't happen.
 » 3 months ago, # |   0 someone know why this submission keep wrong on test 3 problem C plsmy submission
 » 3 weeks ago, # |   0 #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vi; typedef pair pi; #define F first #define S second #define PB push_back #define MP make_pair #define REP(i,a,b) for (int i = a; i <= b; i++) int KadaneAlgorithm(const vector& array) { int best = 0, sum = 0; for (int k = 0; k < array.size(); k++) { sum = max(array[k], sum + array[k]); best = max(best, sum); } return best; } int main() { ios::sync_with_stdio(0); cin.tie(0); ll t; cin >> t; while(t--) { ll n; cin >> n; vi a(n); for(int i = 0 ;i < n ;i++) { cin >> a[i]; } vi pref(n,0); pref[0] = 1; ll res = 0; //cout << 1 << " "; for(int i = 1 ;i < n ;i++) { pref[i] = pref[i-1] + (a[i] >= a[i-1]); // cout << pref[i]<<" "; } //cout << endl; ll sum = 0; for(int i = 1 ; i < n ;i++) { if(a[i] <= a[i-1]) res++; } for(int i = n - 2 ; i >= 0;i--) { if(a[i] >= a[i+1]) { sum++; // cout << sum << endl; } pref[i] += sum; } for(int i = 0 ;i < n ;i++) { // cout << pref[i] << " "; } //cout << endl; for(int i = 0 ;i < n ;i++) { res = min(res,pref[i]); //cout <