### vovuh's blog

By vovuh, history, 13 months ago, ,

1095A - Repeating Cipher

Tutorial
Solution

1095B - Array Stabilization

Tutorial
Solution

1095C - Powers Of Two

Tutorial
Solution

1095D - Circular Dance

Tutorial
Solution

1095E - Almost Regular Bracket Sequence

Tutorial
Solution

1095F - Make It Connected

Tutorial
Solution

• +31

 » 13 months ago, # |   0 In problem C, what if the constraints for n and k are 1018 ? Is there any other better solution possible since the given one will run out of space and time !
•  » » 13 months ago, # ^ |   0 since in worstcase you need to print k numbers... there is no way... if we change the output format to print tuples (2^x, count) it is possible
•  » » » 13 months ago, # ^ |   0 Yes ! Completely forgot about it (maximum allowed output constraint)! Thanks..
 » 13 months ago, # | ← Rev. 2 →   0 I would like to know if my AC algorithm for problem D could actually be hacked somehowhttps://codeforces.com/contest/1095/submission/47607217What the program does is: If the I kid remembers kids A and B in front of him, that means I is before A and B, so we draw two directed edges I->A, I->B. There is an order to be decided between A and B that we don't know of yet, so we also draw a pointed line A---B between them. When all the lines have been drawn, we iterate over each directed edge U->V, and if there was a pointed line U---V, then i assume the order U->V is indeed correct, so we add this directed edge U->V to an answer graph G. Note that there might be multiple solutions, so U->V and V->U might end up existing at the same time. When we finished generating this answer graph G, visit all the nodes, starting from 0 and going to a any non-visited neighbor that we can go to through an edge I think the go to any part might actually be hackable
 » 13 months ago, # |   0 In problem C, the for loop is from i=0 to i=30. As we know that 'int' is of 32 bytes,so I am unable to understand as to why the loop is not from i=0 to 31. Also I saw the codes of many programmers for the problem C and nearly everybody has done it from 0 to 30. So please explain the reason for this.
•  » » 13 months ago, # ^ |   +5 230 = 1073741824. You don't even need 30 in this cycle, 29 is pretty enough, because for numbers up to 109 the maximum power of two in their representation is 229 = 536870912.
•  » » » 13 months ago, # ^ |   -6 Ohk.. I understood it is due to the given constraint. Thanks!!
•  » » » » 11 months ago, # ^ |   0 not just the given constrains , but actually bit number 31 is the sign bit so (1<<31) would give you negative number so as long as n is positive you don't need to worry about this bit (if you use integer not unsigned integer).
 » 13 months ago, # |   0 Where is editorial for problem 1095C - Powers Of Two?P.S: "Unable to parse markup [type=CF_MATHJAX]" in spoiler.
•  » » 13 months ago, # ^ |   +12 Oops, sorry. Fixed now.
 » 13 months ago, # |   0 So my solution for D was completely different... I created a matrix in which placed the 2 neighbors for each kid. But how? Well, for example, if the next 2 kids after the first one are 3 and 5, 3 will be a neighbor for 5 and vice versa. Now i could just pick a number, go through this matrix and find the next one. But one more problem.. Sometimes the result was counter-clockwise, so i just added an extra condition : so for the first kid, i would go through that matrix and see which one of those is a 3 or a 5 (one of them), then pick it and do the same thing for it and so on. It was such a rushed solution, yet it worked and i am really please with it ;)
 » 13 months ago, # |   +3 anyone please explain Problem E..I am unable to understand "if conditions in loop" especially.
 » 13 months ago, # |   +5 Problem E can also be solved easily using a segment tree+lazy updates
•  » » 13 months ago, # ^ |   +2 actually just segment tree works, without the lazy updates.
•  » » » 13 months ago, # ^ |   +1 true, didnt think of that thanks
•  » » 13 months ago, # ^ |   0 Then i wonder how it is implemented
•  » » » 13 months ago, # ^ | ← Rev. 2 →   0 we convert the string to +1 and -1 (+1 when opening parens, -1 when closing parens) then we compute the cumulative sum array, and then we put the cumulative sum array in a segment tree. To check if changing the i-th parens "fixes" the sequence we do the following: if the i-th element in the string is opening parens we subtract 2 from me segment [i,n] and if its a closing parens we add 2. (this simbolizes changing the parens to the oposite one) then we do rmq(0,n) and rmq(n,n) if rmq(0,n)<0 or rmq(n,n)!=0 then its an invalid sequence
•  » » » » 13 months ago, # ^ |   0 the way i did it was in each node of the segment tree, I stored i>The number of valid pairs in the range ii>The number of unpaired opening brackets iii>The number of unpaired closing brackets While merging the nodes, observe that the unpaired opening brackets in the left can be paired with unpaired closing brackets in the right child.In the end, just check whether the root has any unpaired opening or closing brackets.The problem is similar to https://www.spoj.com/problems/BRCKTS/
•  » » 13 months ago, # ^ |   0 Please give me the segment tree idea for problem E
•  » » » 13 months ago, # ^ |   0
•  » » » » 13 months ago, # ^ |   0 Thank You <3
 » 13 months ago, # |   0 Is there any easy explanation of problem E.
•  » » 13 months ago, # ^ |   0 The problem is similar to this one SPOJ/BRACKETS
•  » » » 13 months ago, # ^ |   0 I am getting TLE with segment tree.
•  » » » » 13 months ago, # ^ |   0 Here's a nice article about the implementation with segment trees (https://www.geeksforgeeks.org/range-queries-longest-correct-bracket-subsequence/)
•  » » » » » 13 months ago, # ^ |   0 Can you check https://codeshare.io/5MnWVe why I am getting TLE.
 » 13 months ago, # |   0 In E, can you explain your choice of indices for this part: for (int i = 0; i < n; ++i) { pref[i + 1] = pref[i] + (s[i] == '(' ? +1 : -1); okp[i + 1] = okp[i] & (pref[i + 1] >= 0); suf[n - i - 1] = suf[n - i] + (rs[i] == '(' ? +1 : -1); oks[n - i - 1] = oks[n - i] & (suf[n - i - 1] >= 0); } It seems arbitrary to me whether you'd do that or do something like pref[i] = pref[i-1] + (s[i] == '(') : 1 : -1). The code is actually different, but I don't understand the difference.
 » 13 months ago, # |   0 You can also solve F by Prim's algorythm with asymptotics O(NlogN+MlogN).
 » 13 months ago, # |   0 For Problem E with test case 8 )))((((( why is the answer 0? Can't I change it to ()()()() with modifications at positions 1, 3, 4, 6 and 8?
•  » » 13 months ago, # ^ |   0 Because you can and only can change exactly one bracket according to the problem description
•  » » » 13 months ago, # ^ | ← Rev. 2 →   0 one type of bracket or just any one bracket (i don't get the logic for above example) , also then how come answer to 6 (((()) is 3
•  » » » » 5 months ago, # ^ | ← Rev. 2 →   0 Just one bracket. Possible for (((()) : ()(()) ; ((())); (()())
 » 12 months ago, # | ← Rev. 3 →   0 In the D task: Why needs to decreases the input by one? I tried not to do and not works, but i don't get why needs to be done. Can someone explain to me? EDT: get it
 » 12 months ago, # |   0 for(int i = 0; i <= 30; i++) if(n & (1 << i)) //This if condition { if(i > 0) q.push(1 << i); ans[1 << i]++; } please explain what the first if condition in this piece of code does.
 » 12 months ago, # |   0 In problem C solution in the while loop why the if statement if(z/2>1) is given. please anyone explain it?? while(cnt < k && !q.empty()) { int z = q.front(); q.pop(); ans[z]--; ans[z / 2] += 2; if(z / 2 > 1) { q.push(z / 2); q.push(z / 2); } cnt++; } 
•  » » 12 months ago, # ^ | ← Rev. 2 →   0 Because if you push 1 in your queue, then when 1 will get popped, ans[1/2]+=2 will happen, you cannot break 1 into two 0s, where as you can break other power of 2 into 2 parts to increase your count by 1
•  » » » 12 months ago, # ^ |   0 ohh thanks i got it.@siddharthp538
 » 12 months ago, # |   0 1095A — Repeating Cipher Solution & explanation :https://cyclocoder.blogspot.com/2019/01/codeforces-1095a-solution-and.html
 » 12 months ago, # | ← Rev. 7 →   0 I m not satisfied with B. Array Stabilization tutorial logic which is given here ...because let's assume 5 2 4 8 2 7 after doing sorting .. according to ur logic ans will be min(7-2,8-2)=5 that should be min(7-2,8-4)=4and u didn't mention about that all element are distinct. if i was wrong please let me know
 » 8 months ago, # |   0 In problem C what is the function of map ? and what it is doing in program i don't understand
•  » » 6 months ago, # ^ |   0 The map stores the number of occurrences of various powers of 2. It comes in handy when we want to split a set-bit ( a power of 2 ) into two lesser powers of 2.
 » 8 months ago, # | ← Rev. 3 →   0 In problem E, in the first example, why the answer can't be ()(())? this is a regular bracket sequence
•  » » 5 months ago, # ^ |   0 It can. You can flip positions $2$, $3$, and $4$ (1-indexed) while being valid in that test case, and your answer is a result of flipping the position $2$.
 » 7 months ago, # | ← Rev. 3 →   0 For 1095F, my algo is to generate all normal edges with cost and insert them into set with special edges(with their costs). Now ANS set to maintain the the edges for graph, the condition for insertion in this set will be that both vertices of edge(which is being inserted) should not have another edge connected to it, & that edge is not present in ANS set, parallelly caculating the min_cost. Format for EDGES set is > : >, so all edges are sorted in ascending the order thus minimising the cost. CODE: #include using namespace std; typedef long long ll; int main() { int n, off; cin >> n >> off; ll a[n+1]; for(int i = 1; i < n+1; i++) cin >> a[i]; set< pair> > edge; for(int i = 1; i <= off; i++) { int u, v, c; cin >> u >> v >> c; if( u > v) { int s = u; u = v; v = s; } edge.insert(make_pair(c, make_pair(u, v))); } for(int u = 1; u <= n; u++) for(int v = u+1; v <= n; v++ ) { int c = a[u] + a[v]; edge.insert(make_pair(c, make_pair(u, v))); } set> ans; int cost = 0; int i = 1; bool vis[n+1]; memset(vis, 0, sizeof(vis)); for(auto p : edge) { if( i > n-1) break; auto e = p.second; if(ans.find(e) == ans.end() && (!vis[e.first] || !vis[e.second])) { ans.insert(e); cost += p.first; vis[e.first] = 1; vis[e.second] = 1; i++; } } cout << cost; return 0; } 
 » 5 weeks ago, # |   0 In Problem D, why is the counter clockwise not acceptable?