Rounds 451 and 452 were genuinely quite easy, but I made foolish mistakes.
Here are notes on the problems I caught up on. The rest were very straightforward.
For Problem D, use greediness: scan left to right and remove the rightmost element whenever the condition is violated. I somehow wrote a Fenwick tree, then missed one case in the check and got WA.
For Problem E, simply split into cases and greedily move the part that exceeds $n/2$.
Problem F is worth discussing. Given a string of length around $10^6$, write it in the form X + Y = Z.
First, of course, enumerate the split position of the first number. After that, I did not know what to do.
For X + Y = Z, the length of Z is either equal to the length of X, one more than the length of X, equal to the length of Y, or one more than the length of Y. There are only these four cases. That is enough.
How do we check the addition? Use prefix hashing. I still got through with a trick and some luck; in a contest, two independent hashes should be used. A painful lesson.
repp(i, 1, len) { if (check(i, len - i)) { return; } if (check(i, len - i - 1)) { return; } if (check(len - i - i, len - i)) { return; } if (check(len - i - i - 1, len - i - 1)) { return; } } }