426A - Sereja and Mugs
Lets count the sum of all elements Sum and value of the maximal element M. If Sum - M ≤ S then answer is yes, otherwise — no.
426B - Sereja and Mirroring
Lets solve problem from another side. We will try to cut of matix as many times as we can. Cut means operation, reversed to operation described in statement. To check, can we cut matrix we need to check following conditions:
1). n mod 2 = 0
2). ai, j = an - i + 1, j for all 1 ≤ i ≤ n, 1 ≤ j ≤ m.
425A - Sereja and Swaps
Lets backtrack interval on which will contain maximal sum. To improve our sum we can swap not more then k minimal elements from the interval to k maximal elements that don't belong to interval. As n isn't big we can do it in any way. Author solution sort all elemets from interval in increasing order and all elements that don't belong to interval by descreasing order. We will swap elements one by one while we haven't done k swaps and we have some unswaped elements in first set and we have some unswaped elemets in second set and swap is optimal(we will optimize the answer after this swap). Author solution works in time O(n3·log(n)).
Is there some ideas how to solve this problem in time O(n) or O(n·log(n)) ?
425B - Sereja and Table
Note, that if we have two arrays x[1..n], 0 ≤ xi ≤ 1 and y[1..m], 0 ≤ yi ≤ 1, then described matrix can be showed as next one: ai, j = xi xor yj.
If n ≤ k, then we can backtrack array x and using greedy find best y. Otherwise there will be atleast one i, such that we will not change any cell in row number i. So we can simply bruteforce some row and use it like x. Then we use greedy and find y. From all possible rows we choose most optimal. Such row will be as number of mistakes is lower then number of rows, so it isn't possible to have atleast one mistake in each row.
Greedy means next algorithm: for every element of y we will look, will it be better to choose it like 0 or 1. To find better choise, we will count number of different bits in x and current(lets it be j) column. If number of different if lower then count of same cells we will set yj = 0, otherwise yj = 1.
425C - Sereja and Two Sequences
In thgis problem we will use dynamic programming: dpi, j — minimal pozition of deleted element in second array, such that we have made first operation j times and have deleted not more then i elements from first array.
Lets decided how to calculate transfers. Standing in pozition dpi, j we can change nothing and go to pozition dpi + 1, j, by other words make transfer dpi + 1, j: = min(dpi + 1, j, dpi, j). What happens when we make first operation with fixed prefix(by i-th element) in first array? We should find element in second array with number greater dpi, j and value equal to ai, lets its pozition is t, so we need to make transfer dpi + 1, j + 1: = min(dpi + 1, j + 1, t).
How to find required element quickly: lets just do vector of pozition in second array for all different elements that contains in second array. Then we can simply use binary search.
425D - Sereja and Squares
Lets line x = k contain not more then points. Then for each pair of points on this line (lets it be (k, y1) and (k, y2)) check: is there squere that contain them as vertexes. So we should check: is there(in input) pair of points (k - |y2 - y1|, y1) and (k - |y2 - y1|, y2), or pair (k + |y2 - y1|, y1) and (k + |y2 - y1|, y2).
Lets delete all watched points, and reverse points about line x = y. Then each line x = k will contain not more then points. Will solve problem in the same way.
Now we should learn: how to check is some pair of points(on one vertical line) in input. Lets write all of this pairs in vectors. Each vector(for every line) will contain pairs that we should check on it. Suppose, that we check it for line number k. Lets mark in some array u for all points with x-coordinate equal to k uy = k. Now to check is our pair with y-coordinates (y1, y2) on line we can simply check following condition: uy1 = uy2 = k.
425E - Sereja and Sets
First, lets look at F(S). First, we sort all intervals by second coordinte and then go by them in sorted order. And if current interval don't intersected with last taken to the optimal set, we get our current to the set.
Our solution will be based on this greedy. Solution of the problem is next dynamic:
1). number of position of second coordinte of interval
2). number of intervals in good set
3). second coordinate of last taken interval to the optimal set
How should we make transfers? Lets note that when we know dpi, count, last we can change last by i, or not change at all. Lets look what happens in every case. In first case last is changed by i, so we should take to optimal set atleast one of the inervals: [last + 1, i], [last + 2, i], ..., [i, i], number of such intervals i - last, number of ways to get at least one of them is 2i - last - 1. All other intervals: [1, i], [2, i], ..., [last, i] we could get as we wish, so we have 2last ways. So total number of transfers from dpi, count, last to dpi + 1, count + 1, i is (2i - last - 1)·(2last). If we count number of transfers from dpi, count, last to dpi + 1, count, last, we can simply use number 2last(as described early).
Also we shouldn't forget about trivial case dpi, 0, 0.
So now we have quite easy solution.
D can be solved without using sqrt(n) in a solution and dividing lines into large and small. This algorithm works: Fix upper right corner (x0, y0). We have to choose second corner of our square. We have two sets of candidates those of form (x, y0) where x < x0 and those of form (x0, y) where y < y0. Let's iterate over all candidates from smaller set, which will result in O(n^(3/2)) algorithm.
I think that many contestants implemented that solution using this optimization without any knowledge that this will in fact improve complexity and got accepted :P. Frankly saying I didn't know the proof too, but I knew that problem and solution earlier :P.
If I get you clearly, to get your O(N3 / 2) you have to use some kind of hash_set. Or how do you want to check third and fourth square corners in O(1) time?
Thanks to this comment I got such solution AC with unordered_set (C++ hash_set). But same code got TL with C++ set (binary search tree).
So did you mean to use hash_set?
No, I did't use hash_set or structures like that. We had to answer queries like "Does there exist point (xi, yi)?" and I did it offline. When I have k points with constant coordinate x equal to a and I got l points which I want to check if they exist I can simply do this in complexity O(k + n). Coordinates are small, so I don't need even this lists of points to be sorted.
If you want to see my code (which is in fact ugly, because of big quantities of copy-paste :( ), here it is: http://mirror.codeforces.com/contest/425/submission/6492350
You can use vector instead of uset, for that you only use uset to store ordered elements. and the complexity is O(n*sqrt(n)*log(n)) I think. Here is my submission: http://mirror.codeforces.com/contest/425/submission/6573893
Sorry for mis-post. You can use vector instead of uset, for that you only use uset to store ordered elements. and the complexity is O(n*sqrt(n)*log(n)) I think. Here is my submission: http://mirror.codeforces.com/contest/425/submission/6573893
"Is there some ideas how to solve this problem in time O(N) or O(N * log(N)) ?" My solution for Div1 A (Div2 C) runs in O (N*(k^2)) http://mirror.codeforces.com/contest/425/submission/6494646
Can you explaint what the state dp[i][j][k][l] means?thx.
Sure
At any given index ind (0<=ind<n), we have 3 states (st)
0 means we have not started the targeted interval yet
1 means we have started the targeted interval, but did not close it
2 means we have started the targeted interval and closed it
according to this values, we can decided whether to use the element at the current index or not.
Skipping an element within the target interval increases the value (up)
Considering an element outside of the target interval increases the value (dw)
for a valid solution, st must be 1 or 2, and up = dw
elegant algorithm. But I think you should not initialize the dp[][][][] with -1,since maybe some answer is actually -1.
Yes, you are right, that must be a bug.
My solution for Div1/C runs in O(N2K) using DP. 6490996
But it seems that runs faster than you for the testcases
31 ms < 93 ms
Do you have any description?
Yes, the bug is setting dp with -1.
I fixed it here 6501625
Thanks for solution. I didnt get the greedy one on the tutorial and it is was a good practice for dp.
Is it possible to see any valid implementation of 425D - Сережа и квадраты of author's way solution? Thanks
C. Sereja and Two Sequences can the second action move empty sequences? can you explain the second sample?
C. Sereja and Two Sequences
can anyone explain it for me ? I'm not very sure about the problem.
You can use operation 1 only if last element of prefixes is the same.
For test 2, you should do first operation 1 with prefixes (1) and (1), getting
2 3
2 4 3
Then you do operation 1 again with prefixes (2) and (2)
3
4 3
As you removed 4 elements from the sequences, you can now do operation 2 with a cost of 4 energy points, for a total of 1000+1000+4=2004 energy points. Note that you cannot remove (3) and (4 3) at the end, because you wouldn't have enough energy to perform operation 2 at the end (the cost would be 1000+1000+1000+7=3007). You NEED to do operation 2 as last operation.
For test 4, you can remove all elements using operation 1 three times (the first is on (75575 42837), (42837)), and you have enough energy to do it.
thanks. "The second action is worth the number of energy units equal to the number of elements Sereja removed from the sequences before performing this action." I misunderstood.
Can someone explain this solution 6491956 to div1 E?
Why is it Giving WA on problem c Div2??
Please help!!
6500849
Line 59:
You won't iterate over last element of y, so you should check
_ot >= 0
, not_ot > 0
.Submit with
_ot >= 0
: 6501201Silly mistake :3 Thank you :D
So what is the final time complexity of problem B Div 1 (D Div 2) "Sereja and Table"?
Θ(n3), n > k
Θ(2k.mn), n ≤ k
Can you translate the Russian language into English?
It was also possible to solve Problem 425B — Sereja and Table with backtracking. First of all, the required condition for the table holds if and only if for each 2x2 square inside the table it is true that either the number of 1s is 0, 2 or 4. So we start with finding all the bad squares and putting them into a set. Then try all possible changes of a single bad square (flipping a single number inside it). Since we flipped a single number, only four squares that intersect that number might have changed from bad to good or vice versa, so we should only check them. With a simple optimization this passes the time limit: 6507534
What does it mean by "Watched Points" int "425D — Sereja and Squares", http://mirror.codeforces.com/contest/425/submission/6573664 Here is my solution, and get WA #25. Can someone help me? Sincerely.
I think by watched points, the author means the points which has already been processed.
Can someone re-explain the algorithm of 425B — Sereja and Table? I do not understand it at all.
Could someone please explain why the solution to Div1B Sereja and Table works?