Hi everyone!

It's been a while since I set problems for Codeforces competitions, so I hope that you had sufficient opportunity to rest before dealing with my problems again. Oh, no-no, there's nothing to worry about! Probably! I promise!

jeroenodb and adamant (that's me!) are happy to invite you to Codeforces Round 869 (Div. 1) and Codeforces Round 869 (Div. 2) which are going to take place at Apr/29/2023 17:35 (Moscow time). Participants with a rating strictly lower than 1900 will participate in Division 2, while participants with a rating of at least 1900 will participate in Division 1.

All the problems are prepared by us, and we would like to thank:

- dario2994 for rejecting sufficient amount of problems for me to be able to set Oleksandr Kulkov Contest 3, for thorough and dedicated coordination and for suggesting one of the problem ideas for the round.
- izban, gamegame, tfg, fedimser, Endagorion, nor, rivalq, errorgorn, antontrygubO_o, redpanda, Runtime-Terr0r, izhang, Everule, NemanjaSo2005, ak2006, ayhan23, SlavicG, c_plus_plus, amiya, willy108, madlogic, LeticiaFCS, tanus_era, nigus, Plurm, mathdude42, SajidZakaria, ace-in-the-hole, InternetPerson10, alwyn, -is-this-fft-, DJeniUp and dorijanlendvaj for testing and/or valuable feedback and insights about the problems.
- MikeMirzayanov for Codeforces and Polygon and KAN for all his effort in coordinating coordinators :)

In both divisions, you will have **2 hours and 15 minutes** to solve **6 problems**.

Score distribution in both divisions: **500 — 1000 — 1250 — 2000 — 2500 — 3000**.

Good luck and have fun!

The **editorial** is out.

Congratulations to the winners!

**Div. 1**:

**Div. 2**:

As a tester, I enjoyed testing the round. Good luck to all the participants!

Runtime-Terr0r orz. I hope your rainbow looks sexy.

Runtime-Terr0r orz!

Dukkha Dukkha and rainboy have pretty sexy rainbows

Sometimes I wonder, if Dukkha and rainboy are same person's account.

Here is the man, the myth the legend. THE KAIBOY ...

kaiboy

After seeing the first question, inner me: it's time to die.

Imagine commenting,instead of attempting the problem during contest.

As a tester/problem discusser, I hope the participants like the problems as much as I did.

Yeah i hope so!

As a participant, I will appreciate the work of authors and testers.Thank you for the contest!

we did not mr orange try to be stuck at a 500+ your rating and you ll get it

As a back-to-back tester, I really enjoyed testing this round! very interesting problems )

Hope everyone will able solve at least 3 problems

As a tester, I saw a twist on one of the problems that I have never seen before!

Now that the contest has ended, I am curious to what you were referring to.

The custom prepared program for Toys is something I have never seen before.

Yeah this is something new for a codeforces contest. However, I witnessed something similar at IEEEXtreme 14.0 about 3 years ago at this problem. They made an entire downloadable game and it strangely includes all testcases. Not sure if you can still download and play it though.

As a tester, Best contest I have ever seen!

writing announcement 4 days before the round -> good round

As a tester, I regret not doing this round officially.

неееееееееет

As an early tester, I'm pretty sure I haven't seen the newer problems but I'm sure they'll be interesting.

As a tester the round has cute problems :DD

before contest, I read this comment, I felt it was sarcastic based on your DP. My prediction was right xD.

As a participant I won't participate

As a participant, I will try my best to participate in the contest. I hope I will give my best.

And also best of luck everyone.

hope be easy

Holy hell, so many testers!

Hope this round is cool

Is it rated for everyone?

Yes. Everyone with < 1900 rating can patricipate in the Div. 2 rated and everyone with rating >= 1900 can participate in the Div. 1 rated.

As a Div 3 tester, this round will be interesting and challenging for Div 3 participants. Good luck and hope you enjoy the round! :)

hi fellow friend. how so good tester. teach me your ways :pleading_face:

As a participant, I will participate. Wish everyone the best of luck and positive delta!

As a first-time Div.1 participant, I hope that I stay at Div.1.

UPD:Mission accomplished somehow.First time Div 1 here as well! Just turned purple 1 minute ago.

Congrats and good luck

Very early score distributions indeed!! ♥

adamant Orz

Clashes with LeetCode Biweekly 103

Codeforces >> Leetcode

:)

Div.1 and Div.2 will both be rated?

This is part of an old Bug Which is reported many times. Here I reported. instead of supporting, people started downvoting, so nobody works on it.

If someone reports bug, and others support the initiative, then bugs could be solved by getting developers attention.

https://codeforces.com/blog/entry/114097

Good Luck for all participants

How many common problems between the divisions? Can't figure out from scores.

Hopefully to reach cyan again!good luck everyone!

I hope to stay cyan :(

Hey if anyone is interested in becoming friendly competitors, you can reply I'll add you and we can compete together during contests.

If you add me, please let me know so that I can add you back!

Just go easy on me

How to Approach hard problems D, E and F in DIV2

Hoping to solve till Div 1 C today and achieve my first ever rating plus as master, and first ever rank maintainance as a separate Div 1 participant.

Self Jinx. Back to back FSTs after this comment. Sad

Let's make it three in a row!

Good luck and have fun!

Good luck to all the participants ;)

New in CodeForces. Spent only 8 nights solving problems here. Participating in this contest. Hope to enjoy and try and solve.

It is game time.

people who will realize div2 c twist after contest :( me who got it during contest :) after getting two WA

then it's a :) for me too

What's the twist?

v[r]-v[l] i was doing earlier but v[r]-v[l+1] this was indeed a twist for me atleast

Lmao, I got stuck trying to do it with segment trees. When I switched my approach, there was hardly time left for casework!

Hmm oki

Can you please explain why l+1 is used here with an example?

i am using prefix sum and storing a cnt for the index 2<=i<n v[0]=0,v[1]=0 with condition if(v[i]<=v[i-1] and v[i-1]<=v[i-2])cnt++; v[i]=cnt;

example :- 1 2 4 3 3 5 6 3 2 1 v would look like [0,0,0,0,1,1,1,1,2] and suppose to query is 4 7 then do the casework if(r-l+1<3)cout<<r-l+1<<endl; else { int dif=v[r]-(l+1<n?v[l+1]:0); cout<<r-l+1-dif<<endl; } why l+1? because we have to consider elements from l to r inclusive but for lth index my answer would be stored in l+2th index given the condition above but I have to include my lth so i will substract v[l+1] till which I don't have to consider; here answer for this query will be 4

Thanks <333

you are too day^-1

Many people would have left due to problem A. 17k registrations and only 6k participants

explain C, pls

Use prefix sum. Do casework.

i used prefix sum, but dont casework(

Much casework...

what is wrong in my case

Use this test case

Correct answer is 2. Your code is giving 1.

how you are so fast and smart?

actually there are more errors.

I need it too. Got WA 3 times. Anyone pls explain.

Store all the important points, i.e., where $$$a[i]>a[i-1]$$$. In this case, $$$i$$$ and $$$i-1$$$ both are important points.

Now for a query just check how many important points are between $$$l$$$ and $$$r$$$. Add $$$1$$$ if $$$a[l]$$$ is not an important point. Similarly, add $$$1$$$ if $$$a[r]$$$ is not an important point.

Think why it's working!

https://codeforces.com/contest/1818/submission/203949170

I have an array of "holes" where i store the indexes where it is bad, aka i >= i+1 >= i + 2

Then I just binary search for the leftmost hole, rightmost hole then the answer is

`r - l + 1 - hole_count`

It is sort of doing binary search on intervals.

There is some more casework (e.g.

`r - l + 1 < 3`

, if there are no holes, if the leftmost / rightmost hole does not fully cover the left/right portion)Time complexity: O(n + q log n)

Suppose you have three consecutive elements $$$x$$$, $$$y$$$ and $$$z$$$ where $$$x \geq y \geq z$$$. Then for any range that includes $$$x$$$ and $$$z$$$, there is no point in keeping $$$y$$$ in the subsequence, since any subsequence that contains $$$y$$$ must exclude either $$$x$$$ or $$$z$$$, whereas it would have been better to keep both $$$x$$$ and $$$z$$$ instead ($$$x$$$ can have an easier chance of connecting to stuff in the left since it's $$$\geq y$$$ while $$$z$$$ can have an easier chance of connecting to stuff in the right since it's $$$\leq y$$$).

My approach was to mark all such $$$y$$$ as "useless" indices. The non-useless indices (aka useful indices) will already form an almost-increasing subsequence, so we can always include them. We can use a prefix sum to count how many useful indices we have so far. Now, for each query, we can count all the useful indices between $$$\ell$$$ and $$$r$$$. If either of $$$\ell$$$ or $$$r$$$ are useless, we should add it to our subsequence too.

My submission: 203942625 The rem vector marks useless indices.

I'm not a good fisherman bcz I couldn't catch the fish from the graph(problem D xD)...

The webpage with a simulator for problem D was very helpful. Thanks!

No tougher A please, people are simply skipping contest after seeing A.

I think understanding the statement was tough but the implementation was easier.

Can Someone Tell The Idea For Problem C If Instead of Subsequences It Was Subsegment?

Use prefix sum. For each query, do casework on l

Can You Please Elaborate More? It will be Helpful

Hint for Cwe can observe that if there is a decreasing sequence of size n( n >= 3), then we must remove n — 2 numbers and don't erase the smallest number

I misread the problem during contest and wasted my time solving

"Subsegment"version ;(I don't know if it have simpler solution but I have a possible solution for "Subsegment" version of Div2C using segment tree in $$$O(n + qlog(n))$$$.

Here is my code

ExplanationConsider $$$mark[i] = 0$$$ if $$$a[i] \geq a[i+1] \geq a[i+2]$$$ and $$$mark[i] = 1$$$ otherwise

We can compute $$$consec[i]$$$ as number of consecutive ones in $$$mark$$$ starting from position $$$i$$$.

Also we can store $$$head[i]$$$ as position of first of consecutive ones including position $$$i$$$ (and if $$$mark[i] \neq 1$$$ then $$$head[i]=-1$$$)

Now using $$$consec$$$ and $$$head$$$ we can solve it using max query on segment tree. it is important when we making query on $$$[l, r]$$$ we don't consider the ones in $$$mark$$$ which are in the right of our range. so we have to temporarily making a minus something add query on segment tree to decrease consec values on the rightmost of our range. (How we know where it started? remember we stored $$$head[i]$$$)

pseudocode of answering each query:

i was also solving for subsegments initially the problem then essentially reduced to taking max of intersection (l,r) over certain intervals which i was not able to figure out within the time constraints

The demo page really helps a lot when solving div1 D.

Hi, the system verdict my solution was used the edge (2,4) twice while I checked the output, it doesn't seem like that. I don't know what's happen. Is my solution wrong or is there any problem with the verdict system? https://codeforces.com/contest/1818/submission/203958546

You forgot to output the number of edges in your subgraph. Because now all numbers are offset, the checker comment is weird.

Excellent fishy contest

Is it me or C was disgusting to implement?

Nope, check my submission :)

For Div2, difficult A and nice C.

can you explain c?

Solution or problem introduce?

anyone pls explain how to approach b in div2

I don't know if it's correct or not:

for odd it is impossible since the whole seq is always divisible by r — l + 1. For even I found out that pattern: [2,1,4,3,....n, n-1] was working and I submitted. Let's see if it passes main tests

Write brute force for $$$n\leq{10}$$$ and try to see a pattern... unfortunately that was enough to solve a problem.

If n is odd the there will not be an answer because sum of array = $$$\frac{n(n+1)}{2}$$$ will be divisible by n.

So, now assume n is even. Now consider the permutation p = [1,2,3,4,5,6,7,8,9,10,....] and array a = [2,1,4,3,6,5,8,7,10,9].

If len = r-l+1 is odd. then p[1...len] would have been divisible by len. Also the p modulo len : p[i]%len would be repeating. For example, modulo 3. p = [0,1,2,0,1,2...]. So any subarray of len would be divisible. By making it into array a, we would make sure that in any subarray of len, there is exactly one different element in a than perm.

If len is even. Again p modulo len would be repeating. And for any subarray of len in perm. sum modulo len is $$$\frac{len}{2}$$$. In array a, if subarray starts at odd index(1-based) then set of elements modulo len would be same as in p. But if subarray starts at even index, say l and ends at r(r = l+len-1), the a[l] = perm[l]-1 and a[r] = perm[l]+1. So total sum still remains $$$\frac{len}{2}$$$ modulo len

IN DIV2 D,

We just check for all vertices who have atleast 4 neighbours, whether they are a part of a cycle or not.. Am i missing something?(except implementation)

That's what I did

You have to check if at least 2 more vertices are not part of the cycle.

There are multiple cycles possible from a vertex. If you choose a larger cycle and checking for 2 more vertices return false, it is possible that a smaller cycle exists with 2 more vertices.

I did consider that... IDK what's wrong in my code tho!!

How to solve Div2E/Div1C? UPD: Nevermind, gonna read the editorial

Div1C may not be suitable here. I think Div1C should focus on thinking, and only use basic algorithms like dp or greedy. But this problem is nearly a pure math problem.

Anyway the problem is very nice. Using it in icpc contests may be better.

Isn't Div1C focused on thinking and doesn't use any algorithms at all?

after getting the answer in terms of the coefficients, i think its mostly more knowledge based, both the approaches to compute it (seems to me) you need to know it, or you cant do it.

Well, yeah, you might be right. But I feel like it's a pretty basic math fact. And even though I knew it, when I acquired a formula via coefficients it took me a long time to realize that I could use interpolation to get one coefficient because it was a new angle for me on this. I think I have never before used the interpolating polynomial in competitive programming.

I had never heard of lagrange interpolation before :(, and i consider myself more versed in maths than an average person since i did make our countrys tst.

Ofcourse, its my skill issue, and i learnt something new now, but i think maybe you are biased about it being a basic math fact(for its level). I know a lot of my friends who were in the same boat as me, having got the answer in terms of the coefficients, but no clue on how to proceed.

div1 D was just playing the demo game :sob:

In $$$B$$$ I wrote something weird and it passed. Is it correct?

Iterate over all edges. Fix edge. Let it be in the tail of fish, and let one of its vertices be the center of the fish. Do simple dfs, which will not go into fixed vertice in tail. When in dfs we try to go to center of fish, and there is at least one unused neughbour vertice of center, we found answer. Otherwise continue.

including yourself (member 1)this line should be bold on A (:This was my first contest! Glad I passed at least pretests on A and B. Then I think I understood how to deal with div2C but my solution was too slow so I don't submitted. I preprocessed the whole array finding the bad triplets for which x >= y >= z. Then basically for each query I would count how many "bad triplets" fall totally into the interval [l, r]. Then I would subtract this number from r — l + 1 which would be the answer if no bad triplets fall inside. Is this approach reasonable? How can this be optimized?

You can store a prefix sum and now count how many are in your range in O(1)

Yes, I was close to that but unfortunately I didn't make it during the contest... Anyway, I am happy with that.

dang I spent too much time thinking how to write d1B knowing the solution

My ideas on d1C

if we knew n-th and n-1-th coefficents of A and B then we know the answer to the problem, and to compute them (lets say we are finding for A) we use interpolation by Newton to gradually build A so that it satisfies first i+1 points and deg(A) <=i; if we modify for point i+1, then lets say P(x) was our previous polynomial, and now P1(x) will be modified P(x) P1(x) = P(x) + (x-0)(x-1)..(x-i)*((y[i+1]-P(i+1))/(i+1)!), and we just need to find P(i+1) to know the largest coefficent of P1(x), and the second largest coefficent of P1(x) will be largest of P(x) + ((y[i+1]-P(i+1))/(i+1)!)*(0+1+..+i), so we can always find two largest coefficents of P1(x) if we can quickly find P(i+1), but P(i+1) can be counted using interpolation by Lagrange, and since x[i]=i it looks like every L[i] is a factorial divided by two factorials and i(maybe (-1) in a certain degree), and if we could somehow update them fastly after each step, we could find P(i+1).

Is my approach correct, and if yes, then how do we finish this?

upd.: i checked the submissions and it loosk like there's something simpler, but I don't know

D1A/D2C: Let [L, R] be a maximal non-increasing block (which means a[i]>=a[i+1] for L<=i<R, L==1 or a[L-1]<a[L], R==n or a[R]<a[R+1]) is min(2, R-L+1). Therefore we can solve the problem by prefix sum, but we need to process for blocks on the boundary of the queried range.

D1B/D2D: We need to find a node u with deg[u]>=4 and a cycle contains u. We can build a spanning tree rooted at u of the component of u, and find an edge connecting nodes in different subtrees of u.

D1C/D2E: If d==1 the problem is simple: Since A(x)=a1*x+a0, a1=A(1)-A(0), and B(x)=A(x+s)=a1*(x+s)+a0=A(x)+a1*s, so s=(B(0)-A(0))/a1. If d>1 we can find the (d-1)-th order difference of A and B, they will be polynomials of degree 1, and solve the problem as d==1.

(d-1)-th order differenceFor array {a[0], a[1], ..., a[n]} we denote it's difference as {a[1]-a[0], a[2]-a[1], ..., a[n]-a[n-1]}. Aussume p is a polynomail of degree d, since the coefficient of x^d of p(x) and p(x+1) is the same, they will be canceled in p(x+1)-p(x), so difference of a polynomial of degree d will be a polynomial of degree d-1. Also we can see that the first term of k-th order difference is sum(0<=i<=k)(a[k]*(-1)^k*C(k,i)). So by calculating the (d-1)-th order difference we can turn A and B to polynomials of degree 1.

Hi. I wonder if s = (B(0) — A(0) / a1, is it correct when a1 % MOD == 0? Or can you prove (d — 1)-th order difference of A(1) is not zero. (0.0)

By the constraints of the problem, the d-th coefficient a[d]!=0. If the highest term of p(x) is a[d]*x^d, then the highest term of the difference of p(x) is d*a[d]*x^(d-1). Therefore, the first coefficient of (d-1)-th order difference is a[d]*d!, which is non-zero modulo 998244353.

thanks. I understand ~

I am getting TLE on test case 24 in Div1 B. please help. Here is my submission. 206435558

It seems that conqueror_of_tourist beats tourist again.

Wouldn't say so

Tourist is King System testing Change Everything On Problem E Most People Got FST but Tourist donot That is Tourist Experience he remain King

Fake news, hehehe

FST:(

Fuck me xd I haven't cleared that shit after debugging:

Nice contest, had fun

Huh, no random maxtest in E pretests?

Generally, I didn't want to make pretests for this problem particularly strong, as the key observation could be guessed, and I didn't want people to brute-force their guesses against the pretests. Test 6 is quite large, but it only has very large numbers in the input. In the hindsight, I think I overdid it a bit, and it would be better to include the test 7 into pretests as well, and it was fully random.

Did you explain your intention of the weak pretest to the testers or coordinators? If I were among them I would have strongly opposed the idea.

I did not.

That's pretty sad, but it doesn't surprise me. There were 33 testers and they didn't pay attention to this, while this is one of the things that they should exactly look for.

I generally consider the quality of testing on codeforces as rather poor. Maybe it's a good idea to create some kind of checklist for them to follow, which would contain stuff like check the statement for unclear things and typos, check the strength of pretests (or at least if they contain a random maxtest/everything that they should contain), think if some problems have already appeared before etc?

I think this in particular is because testers are simply not exposed to pretests/systests composition. Few years ago, testing was done on Polygon directly, and now it's just virtual contests in mashups, so they don't really get enough information for quality assurance.

I want to say three things (I was the coordinator):

I should have noticed the small number of pretests compared to the total number of tests (I usually suggest to the authors to have tests=pretests in hard problems, as antontrygubO_o suggested me when he coordinated me).

My

opinionis that weak pretests are always bad. I cannot think of a single exception.If adamant had told me that he wanted to have weak pretests because

[see what he wrote above], I would have tried to change his mind. If he remained adamant (pun intended) about his decision, I might have allowed it. I feel like it is something an author can decide in certain problems (after all, Codeforces has never said explicitly anywhere that pretests are always as strong as possible), and this one is a problem where it makes sense (i.e., 1 person out of 10 might agree with Adamant).Thank you for explaining the situation.

I too believe pretests should be as strong as possible. However, I know some people have a different opinion and they have a right to challenge the tradition.

What I want to say is that they can try to change something, but it must be done through communication. This time it was done by a single person and I feel that is much more problematic than the weak pretest itself.

If I had been consulted about this problem, I would have suggested adding the line "the pretest of this problem is intentionally made weak". This is just an example, but anyway hearing others' ideas could certainly make the situation better.

I hope the future CF rounds will be prepared with better communication.

So happy to have AC-ed Div2C at 2:14:50 in the contest.

adamant Could you please mention first solvers for each problem ? Today is the first time for me to first solve problem. (Problem Div.2 B)

Well done , Hammoda !!

Congratulations :)

Gamedddd

Impressive! Congratulations

Rating boost thanks to div1C.

Very good contest. Div2C and Div2D were interesting.

As a tester, I hope that you have enjoyed this round.

Div1D is one of my favorite problems that I have seen on Codeforces, thank you.

Why are 6 files considered enough for Div1E's pretest... And if you know the solution you find the cases with small $$$n$$$ are not useful, and there exists only one (possibly) useful pretest. Why?

My bug is my fault (detail: I had to check cutting the leftmost/rightmost contiguous intervals (instead of just one element), but I am strongly against having deliberately weak pretests because the contest would heavily depend on hidden information.

But it

doesdepend on hidden information every contest, as long as it's not an official policy to make pretests sufficiently strong. At the moment, there is just no guarantee that the pretests are comprehensive, and you can't (and, imo, shouldn't) depend on it. Of course, one can argue that thereshouldbe such a guarantee, but (again, imo) to give it there should be a global decision, rather than just a tendency.Thanks for reply, yes, it does depend on hidden information every contest and that's why I dislike the current pretest rule. And your point:

makes sense.

Yet, in a particular contest, the more you put useless cases into pretests, the

largerthe factor of guessing hidden information, and the worse (I think) the contest becomes. Or at least "tendency" changes too much. I don't think it is good that one problemsetter can change it (In my opinion this is what the coordinators should keep).Nice contest! Enjoyed D. B Failed system test, but appreciated to contest authors.

I think Div2/C will be more interesting if it was "find longest subsegment" not "longest subsequence" btw good problem

A_G hitting LGM in style 😎

How to add emojisReference Blog

He is from which country? Any idea anyone?

div2 a > div2 b

This round was cool but i really hope we dont see more problems about polynomials at D2E/D1C, lol

Finally, my color got changed.

Problem A was a bit tricky tho(or the problem statement was somewhat confusing), it took me around 20 minutes to figure out the exact solution.

Div2 top5 are alt accs.

As always:(11111011010

I know it's a different blog but why the upcoming contest 870(div2) registration will start at the time of starting of that contest then how people are supposed to register ?? or is it a bug?

Best contest I have ever seen!

ahrorov.5758

We know it

We know you are a faggot)))

Can someone tell me how to solve Div1B/Div2D in $$$O(n+m)$$$?

A_G beat tourist. A_G is the new GOAT.