Блог пользователя DishonoredRighteous

Автор DishonoredRighteous, история, 5 лет назад, По-английски
Tutorial is loading...

Author's solution: 80407149

Tutorial is loading...

Author's solution: 80407200

Tutorial is loading...

Author's solution using formulas: 80407222

Author's solution using prefix sums: 80407239

Tutorial is loading...

Author's solution: 80407273

Tutorial is loading...

Author's solution: 80407303

Author's solution using ternary search: 80407326

Tutorial is loading...

Author's solution: 80407360

Разбор задач Codeforces Round 643 (Div. 2)
  • Проголосовать: нравится
  • +199
  • Проголосовать: не нравится

»
5 лет назад, # |
  Проголосовать: нравится +37 Проголосовать: не нравится

Video Tutorial for C

Enjoy watching!

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Thanks!!

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +16 Проголосовать: не нравится

    Can you add subtitles. Unable to understand you.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +30 Проголосовать: не нравится

    Why don't you make Tutorials of harder problems like F?
    I'm not saying that C was easy.

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +31 Проголосовать: не нравится

      This is a question people keep asking me in both Youtube and Discord, and I feel the need to explain here the answer.

      The first reason why I can't do the video tutorials for literally every task I solved during the contest is because I don't have the time to do this as a full-time activity and I focus my effort on doing a video tutorial for the most interesting task in the contest which is not too easy or too hard.

      Another reason why I can't do some of the video tutorials is because some concepts used in tasks are not suitable for the video tutorial format, a good example would be today's F, because it involves several mathematical observations which are quite hard to explain properly, which would make the video boring and not enjoyable for most of the participants.

      Last but not least, I believe that doing a great video tutorial for something like F takes a lot of time, and at the same time it won't get as much audience as my usual content(Div2 CD/Div3 DE).

      In conclusion, such a discussion is always welcome(I have copypasted some of my arguments I have already mentioned in the discord server) and maybe I'll post something on Youtube to clarify this, because of the reasons I have mentioned above.

      You can always join my discord server for more in-depth discussion.

      • »
        »
        »
        »
        5 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Yeah audience matters. Quality of the content matters too. Youtube have too many coders. I hope you got my point. Waiting to see more vids in future.

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится +10 Проголосовать: не нравится

        Yeah! this is my disscussion.

        I have answered your(stefdasca) doubts in the previous discussion here but i being green got wooed there and when an orange guy Bhj2001 said the same thing(in this post) audience supported him. I am going to be wooed here too but does that bothers me.

        I am said that such a biasing occurs on a plateform where people are literate and more importantly intelligent minds but this doesn't bothers me because i dont care about people's thinking until i my right in my views.

        Coming on stefdasca's doubts and replying to this comment:

        First of all u(stefdasca) need to be clear that why are you doing this:

        1. For sake of Your channels popularity, more views, more audience or

        2. For helping the coding community

        3. Both mixed

        If 1. or 3. is your answer then why dont you make videos for A and B too along with C as it would take very less time and would bring much audience,views and fame to you.

        If your answer is 1. u r doing great, don't read below this.

        Your actions show that you are 1. Otherwise

        You said that you dont have time, so instead of making Div1AB make Div1C(atleast) and D and i dont think so Div1C coudn't be explained with a video by an orange guy like you who has both calliber and talent.

        If you think harder problems would be boring to listen so i would tell you that people who gets bored from F would not come to see the F and who came are very eager to learn it. Also i am assumming that you are not in this for gathering more audience and popularity as stated in 1.

        Adding from previous disscussion, There are few blue coders who upload video editorials for Div1AandB(very well explained) like striver_79

        Dont reply by saying this nuisance "he is doing what he can contribute, atleast he is doing this what is your contribution" To reply this i would reply in your language only that why are you expecting from a green, moreover i upload solutions for ABandC.

        One of the personal reasons for this discussion is that few/many of the times i can't understand Div2DandE from text editorial but this new revelation of video editorials have helped me a lot in personal but i cant find good content for this.

        I know that you guys wouldn't understand but i have to say this.

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится +2 Проголосовать: не нравится

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится

          Basically you want me to do something else just because someone is already doing the same content?

          Sadly, this is not how arguments work, and I believe competition is always welcome in order to make our standards higher.

          As a matter of fact, I did video tutorials for F but they didn't get the same results as C from the same round.

          I don't feel confident enough to explain how every Div1C/D works, otherwise I would have done that, while having more than just 2116 rating.

          That being said, I invite you to respond to the poll I have done on my channel

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          You got downvoted because when you asked this it sounds like you are asking just because you can and you don't need this whereas when bhj2001 asked it sounds like his current content is not useful for him, so he wants to ask if there will be something useful for him in his channel.

          That's the difference here agreed this difference is due to the rating. But blindly voting is not the case. Rather its difference of credibility. I'm also sure the people who downvote you there didn't vote here and those who voted here didn't downvote there.

          Here upvotes are by the people who need Div2F (rating similar to bhj2001) whereas downvotes there are by people with a rating similar to you.

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Your videos are very helpful because they show to the point thinking.And they are really short time 5/6 min only.

        I saw your last Div 3 video E. I was very confused for this problem. But after watching your video I got to know the very basic first approach that was brute force then visualizing it as a DP wheras others just explained it as a DP never told why Dp.

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          I will like to address the "other" keyword here. Since I was the only "other" one who made a video on E, I guess I did say, why DP, when I referred you to checkout min cost path problem during the problem. In min cost path problem video, a proper explanation was given on why DP.

          P.S: If this comment of "other" is for me, please checkout the content before saying this.

»
5 лет назад, # |
  Проголосовать: нравится -12 Проголосовать: не нравится

Editorial so fast

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится -14 Проголосовать: не нравится

So quick editorial! Thank you!

»
5 лет назад, # |
  Проголосовать: нравится -62 Проголосовать: не нравится

I should have checked editorial during contest

»
5 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

Did anyone use recursive DP on problem B, would that TLE?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

So fast Editorial!

PS: the round is too hard for me. A isn't friendly to newbies.

»
5 лет назад, # |
  Проголосовать: нравится -11 Проголосовать: не нравится

The fastest editorial I've ever seen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

»
5 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится

round was great execpt that D, found that too easy

»
5 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

For problem E, if we set F(h) = minimum cost to make all pillars height h, is this function monotonically nonincreasing up to a point and then monotonically nondecreasing?

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Yes.

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится

      Can you prove it?

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      I see passed solutions assume that. and uses the ternary search!

      can someone prove it?

      lohit_97 could you?

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        No, I don't have a proof. More of an intuition.

        You can look at the editorial, and see the cost function for P < Q and P > Q and concavity of cost function changes at some point as mentioned by the editorialist.

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится +1 Проголосовать: не нравится

          Also, just to strengthen my intuition I ran the cost function from H=1 to H=100 for multiple arrays, and I could that function is unimodal.

      • »
        »
        »
        »
        5 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +12 Проголосовать: не нравится

        I cannot prove it analyticaly. but i can prove it intuitively. let f(x) be the function for minimum cost to make all pillars of height x. hence F(x)=n1*a+n2*r-min(n1,n2)*(a+r-min(m,a+r)). n1 is number of bricks to add. n2 is number of bricks to remove. As x increases n1 increases and n2 decreases. let say c is the point where n1 attains its max value but less than n2. And then you can break the function about c. F(x)=n1*(min(a+r,m)-r)+n2*r, x<=c and F(x)=n2*(min(a+r,m)-a)+n1*a, x>c both of the function are of the form $$$ax+by$$$. Hence we can see it intuitively that given function is unimodal.

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится +20 Проголосовать: не нравится

          Could I ask some stupid questions ^^ ?

          1. So do you mean your "$$$c$$$" is the local minima of the function?

          2. And the form of your function is $$$F(x) = ay + bz$$$, so how do you ensure that $$$F(x - 1) < F(x)$$$ or $$$F(x + 1) > F(x)$$$ or something like that? It actually wasn't intuitively understandable for me.

          Sorry for my poor logic ^^. Hope you will answer me <3 <3. Thank you

          • »
            »
            »
            »
            »
            »
            5 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            To answer your question lets define some functions
            $$$g(x)$$$ = $$$Number$$$ $$$of$$$ $$$blocks$$$ $$$needed$$$ $$$if$$$ $$$common$$$ $$$height$$$ $$$=$$$ $$$x$$$.
            $$$h(x)$$$ = $$$Number$$$ $$$of$$$ $$$blocks$$$ $$$to$$$ $$$remove$$$ $$$if$$$ $$$common$$$ $$$height$$$ $$$=$$$ $$$x$$$.
            $$$F(x)$$$ = $$$a*g(x) + b*h(x).$$$
            In div2E g(x) and h(x) have some properties.
            1. g(x) is monotonic increasing function.
            2. h(x) is monotonic decreasing function.
            3. Rate of chnage in $$$g'(x)$$$ is greater than rate of change of $$$h'(x)$$$.
            4. From 3rd $$$g^″(x)$$$ $$$>$$$ $$$h^″(x).$$$
            Now for a unimodal function its derivative has to be monotonic.
            i am assuming a>0 and b>0. $$$F'(x)$$$ $$$=$$$ $$$a*g'(x) + b*h'(x)$$$. at some $$$x$$$ postive $$$g(x)$$$ cancels negative $$$h(x)$$$ , and that $$$x$$$ will be the required minima. You will see it more clearly by writing values of $$$g(x)$$$ and $$$h(x)$$$ for some test case

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится +14 Проголосовать: не нравится

        My proof goes like this:

        Let $$$H, X, P, Q, M, A, R$$$ is declared the same as in the editorial above.

        We prove (from the editorial), when we increase $$$H$$$ by $$$1$$$:

        • $$$P \ge Q$$$ : the cost will change $$$AN−M(N−X)$$$.

        • $$$P \le Q$$$ : the cost will change $$$-RN+MX$$$. $$$($$$Because $$$R(Q' - P') + MP' = R(Q - P) + MP - RN + MX$$$).

        Let $$$F(H)$$$ is the cost when ADD / REMOVE / MOVE so that the resulting height for all the pillars is $$$H$$$.

        Let $$$H_0$$$ is the minimum $$$H$$$ such that : $$$P \ge Q$$$ and $$$X$$$ is minimum as possible (call this $$$X$$$ : $$$X_0$$$).

        When $$$H \ge H_0$$$, because the rate of change when $$$H$$$ increases by $$$1$$$ in $$$F(H)$$$ is $$$AN−M(N−X) \Rightarrow $$$ when $$$H$$$ increases $$$\Rightarrow X$$$ increases $$$\Rightarrow AN−M(N−X)$$$ increases . The same thing implies with $$$H < H_0$$$, when $$$H$$$ increases $$$\Rightarrow X$$$ increases $$$\Rightarrow -RN + MX$$$ increases.

        • Case 1: Suppose $$$AN−M(N−X_0) < 0$$$, when $$$H$$$ increases the rate of change will go from negative to positive. And the function will go like this:

        So it's a part of a unimodal function. We need to prove that with $$$H < H_0$$$ the function $$$F(H)$$$ will be the remaining part of that unimodal function.

        Proof
        • Case 2 : Suppose $$$AN−M(N−X_0) >= 0$$$, no matter the sign of $$$-RN+MX$$$ it will always make an unimodal function because the monotonicity of $$$-RN+MX$$$ and $$$AN−M(N−X)$$$.
»
5 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Could someone help me figure out my mistake in Problem C. I iterate over z and try to find the valid x, y pairs. Here is my submission 80373780. Thanks in advance.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится

    You have ignored the restriction of $$$x$$$ and $$$y$$$ when calculating $$$useless$$$. $$$x$$$ should be in $$$[A,B]$$$ and $$$y$$$ should be in $$$[B,C]$$$.

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Useless is basically the number of points in the rectangle domain [A, B] X [B, C] which are not valid. So I'm interested in the triangle which is within the rectangle. tot is the total number of points which is in the rectangle

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Could someone explain the mistake. thanks in advance

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I almost thought about how to solve problem D! Thank you for preparing this contest!

»
5 лет назад, # |
  Проголосовать: нравится +20 Проголосовать: не нравится

One minute silence for those who wasted time on C instead of D

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Didnt see the leading zero condition in A(sad)..wasted time there; however lucky to notice that D was easy.. At the end did B and D only;; Great Contest overall

»
5 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

felt like one of the toughest div 2 contest ,more like div 1 contest. Test cases were really strong

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    Better to have strong test cases than get hacked afterwards

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      What if someone doesn't hack my submission and my solution is wrong but it passed all pretests.So,during the main tests,the hacker's test cases will again judge my submission,Right?

»
5 лет назад, # |
  Проголосовать: нравится +30 Проголосовать: не нравится

Maybe problem F is solvable for 16 queries. It's still a conjecture, though. Here's why:

We need to find the GCD of hidden number and $$$2^{11} \times 3^7 \times 5^4 \times 7^3 \times 11^2 \times \cdots \times 31^2 \times 37 \times \cdots \times 617$$$.

If my checking program is not wrong, it will go all correct through $$$X = 1$$$ through $$$10^9$$$. The multiplied number is large but $$$1.90354 \times 10^{274}$$$. Since it is less than $$$\left(10^{18}\right)^{16}$$$, we may be able to seek the GCD in $$$16$$$ queries.

Now, the problem is, pack the array $$$(2^{11}, 3^7, 5^4, \dots, 617)$$$ into $$$16$$$ groups, so that products of all groups will be less than $$$10^{18}$$$. When we pack them greedily, I was able to construct the division of $$$17$$$ groups. The $$$16$$$ is somewhat a combinatorial optimization task...

Remark: Construction of 17 Queries
  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    When $$$X = 2^{29}$$$, your code will return $$$12$$$ but the answer is $$$30$$$ which is not correct. right?

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +23 Проголосовать: не нравится

      I forgot to mention that, when the number of divisor is $$$d$$$, we will output $$$max(d + 7, 2d)$$$. So, the program will output $$$24$$$ and the correct answer is $$$30$$$, which is correct.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Yes, we have solution that solves problem in 17 queries. But we make bound a bit bigger.

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +13 Проголосовать: не нравится

      I searched and I think I found $$$16$$$-query construction, that's it!

      Construction of 16 Queries

      We ask the 16 queries and let $$$P$$$ the product of number of divisors of return value. Then we output $$$max(P + 7, 2P)$$$.

      The implementation is 80386409. You can easily see that it's granted accepted for 16 queries! Maybe a world new record?

      The algorithm to find such partition is following.

      1. Choose elements so that product will not exceed $$$10^{18}$$$.
      2. Do 1. for $$$100 \ 000$$$ times and get the choosing combination nearest to $$$10^{18}$$$.
      3. Then, erase the chosen values from the list.
      4. Repeat 1. — 3. while the list is not empty.

      P.S. I have came up with another question. Is it impossible to do with 15 queries? I can barely prove that 14-query construction is impossible, because the product of primes up to $$$617$$$ is around $$$4.35916 \times 10^{255}$$$, which is slightly larger than $$$\left(10^{18}\right)^{14}$$$.
      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится +18 Проголосовать: не нравится

        I wouldn't be certain that the product of these values is enough to claim impossibility. For example, maybe it would be better to ask lower powers of the numbers first?

        If you ask $$$2^6$$$ and the power of number $$$2$$$ is less than $$$7$$$ in the optimal solution then you didn't have to ask $$$2^11$$$ at all which gives you some improvement. And if not, then we know that the product of rest of the numbers can be at most $$$10^9/64$$$, so although we have to retry with powers of $$$2$$$, other numbers may be used in smaller powers.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    I have a randomised solution here. Can it be hacked or improved ??

    Here are the details of my solution:

    I ask for all the primes less than (10^9)^(1/4). Which can be packed into 4 queries. Then I ask for the primes found in another 5 queries. Now the remaning part has atmost 3 primes. Let's denote the remaning part as 'Y' and the no. of divisors found so far as "res".

    Case 1 : Y = p / p*p / p*p*p / p*q , answer = res*2

    Case 2 : Y = p*q*r / p*q*q ,

    Here If I manage to find atleast one prime's existence, I can safely answer res*4, otherwise I answer res*2.

    Atleast one prime among these will be less than X^(1/3). So for each remaning query, I shuffle the remaining primes from (10^9)^(1/4) to (10^9)^(1/3) and ask the query by taking maximum primes.

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +16 Проголосовать: не нравится

      I'm afraid that this solution can be hacked. There are 128 primes which lie in the range $$$[10^{\frac 94}, 10^{\frac 93}]$$$. You can check at most 4 such primes in each randomized query, so at most 52 of them in total. When $$$Y=p*q*q$$$, your probability of failure is more than $$$(\frac{126}{128})^{52} \approx 44\%$$$, which is actually very big. So it can be hacked by a test case like $$$824069460=2*2*3*5*179*181*181$$$.

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Well, Thanks for the hack.

        There are some mistakes in your calculation because I can check 6 primes (why not ?) and I stick to word "remaining" so I remove checked primes for next queries. Still proof by hack says it is significant.

        Here I changed limit from 1000 to 800. Because If all 3 primes are > 800, answer is atmost 8.

»
5 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

So, fast editorial.

»
5 лет назад, # |
  Проголосовать: нравится +33 Проголосовать: не нравится

D was easier to think than c.

»
5 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

can anybody help in proving D second paragraph

  • »
    »
    5 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

    If we assume S<2*N and assume K>0, then we calculate prefix sum array M{ M1, M2, M3,...,Mn}. Now, we are marking all the number that are of the form M1+T*S, M2+T*S, ... , Mn+T*S for all T>=0. An observation is made that if for any integer X, X and X+K is marked, then the array will contain a segment with sum K. This is because if X and X+K is marked then X = Mi + T*S and X+K = Mj + T*S, Mj>=Mi. "T" will not change because K<=S. Now, (X+K)-X = Mj-Mi=K which is the sum of the segment [j...i+1]. hence this segment will contain sum as K. Now we are considering the range [0,..,2*K*S-1]. This contains 2*K*N marked elements because marked elements are M1, M2,..., Mn, M1+S, M2+S,...,Mn+S,....., M1+(2K-1)*S, ...., Mn+(2K-1)*S (Next element M1+2*K*S>2*K*S hence out of range) ----> these are 2*K*N elements.Also all the numbers in the range[0,2KS-1] can be divided in pairs(x,y) such that y-x=K hence (0,K), (1,K+1), (2,K+2), ..., ,(2*K*S-K-1,2*K*S-1). Number of pairs are K*S. Since we are assuming that Petya will lose, so there is no segment whose sum is K, so there is no marked element X for which X+K is marked, So in each pair atmost 1 element will be marked since y-x=K. So number of marked element in the range [0,2KS-1] are less than or equal to KS (number of pairs). But number of marked elements in the range[0,2KS] are 2*K*N. Hence 2*K*N<K*S ---> 2N<S But initially we assumed that S<2*N which is a contradiction.

  • »
    »
    5 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +33 Проголосовать: не нравится

    Here's another way to look at the proof of D:

    Let's look at the prefix sums modulo $$$S$$$. There are $$$N$$$ different prefix sums: $$$M_1, M_2, \ldots,M_N=0(mod\;S)$$$. They are distinct because elements of the array are positive.

    Now, for a given $$$K >0$$$, look at the $$$N$$$ numbers $$$M_1+K, M_2+K,\ldots,M_N+K\,(mod\;S)$$$. These again are distinct among themselves.

    Now you have a total of $$$2N$$$ numbers in $$$[0,S-1]$$$, and since $$$2N > S$$$, two of them must be equal. So we have some $$$1\leq i\neq j \leq N$$$ such that $$$M_i + K = M_j\,(mod\;S)$$$. If $$$i \lt j$$$, then the segment $$$[i+1,j]$$$ sums to $$$K$$$, otherwise if $$$i \gt j$$$ then the segment $$$[i+1,j]$$$ (of the cyclic array) sums to $$$K$$$

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится +75 Проголосовать: не нравится

I think these problems are much harder to prove than to solve. For A, and for D.

»
5 лет назад, # |
  Проголосовать: нравится -18 Проголосовать: не нравится

I am curious if binary search would work in problem E?

Spoiler
»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Thanks for the super fast editorial

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Great problems(especially div2e) and nice editorial! Thanks!

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can somebody hack my C? Im not using dp or any pref sums. 80347181

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    There is a similar one with nicer code formatting. Can somebody explain how it works? Thanks!

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      it's just like mine. we can use two binary searches, one for z and one for x while iterating through values of y. My Submission

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      logic is excluding all [x,y,z] tuples which will not form a triangle i have used an exact opposite approach can look at my solution https://codeforces.me/contest/1355/submission/80351154 (i can explain this if you want may be it will help yo understand that also)

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

      Mine very simple code. perhaps similar to editorial.

      For given $$$Z$$$ we have to find $$$X\,\, and \,\, Y$$$ such that $$$X+Y>Z$$$. which is same as $$$X>Z-Y.$$$ Let say difference $$$d=Z-Y$$$ for any possible value of $$$Z$$$ and $$$Y.$$$ Traverse through all the value of $$$Z$$$ then we can find what are the potential values for difference i.e. $$$ (Z-Y)$$$ can take value in range $$$[Z-c,Z-b]$$$. Now Increment this value of difference in this interval. Do this for all possible $$$Z$$$. Now for each difference you have it's frequency so check where this difference lie in the interval $$$[a,b]$$$ for poosible value of $$$X$$$ and updated the count for $$$X$$$ in the final result.

      Submission

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится -56 Проголосовать: не нравится

Its easy to spot that a great percentage of top 100 participants are alternate accounts of DIV1 people. It will be really great to increase the frequency of Div1 contests to stop the rating theft of Div2 participants. (-_-)

»
5 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

how to do c using prefix sum

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

For problem B using Pypy3 (Python), O(n log n) solutions TLE on test case 26. I saw other Python solutions with the same complexity which failed as well.

It seems to me you have not done a good job of balancing time constraint for the language.

My submission which TLE on test case 26

UPD: The cause seems to be input handling, people who used sys.stdin.readline() instead of input() passed.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

WAS A GOOD ROUND AND I THINK C , D SHOULD BE CHANGED

»
5 лет назад, # |
  Проголосовать: нравится -9 Проголосовать: не нравится

D was easier than c. Problem A ~ Problem B.

»
5 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

To the guys who solved E in contest time. Do you really prove that it's a ternary search problem during the contest or because it's obvious that binary search won't work over here that you go for ternary search? Please it'd be helpful because I thought of it first but then I always stop when I can't prove something.

»
5 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится

Thanks for the amazing contest :)

Also for people saying D was easier than C, sure getting an AC was easier if you tried your luck.

The difficulty of problem D lies in proving that the answer is NO for the case N < 2*S.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится

    could you explain proof ?

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится

      Just an observation for suppose n = 4 m = 5 only option for array is all 1 and any one element is 2 like 1 1 1 2 we can get all k's

      for n = 4 m = 6 we have two option either make two elements as 2 or one element as 3 like 1 1 2 2 (or) 1 1 1 3 in both these cases we can get all k's as we have enough 1's and 2's in first option and in second option we have 3 so we can get higher numbers like 5 and 6.

      simillarly for n = 4 m = 7 but in case of n = 4 m = 8 we can make array as 1 1 1 5 (i.e last element is greater than 4 and there are no enough 1's to get 4) so answer is k = 4.

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

      My strategy to solve D during the contest : strategy

      PS: unable to come up with a convincing proof right now, will try to understand author solution.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Good editorial. Delicate + sort. Thanks

»
5 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Why should we add 1 on $$$[x + B, x + C]$$$ segment? How can this give us the number of pairs such that they have a particular sum?

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +34 Проголосовать: не нравится

    The (intermediate) goal is to calculate the number of (x, y) pairs such that x + y = s for each possible sum s. (It is convenient to keep this counts in a frequency vector indexed by values of s.) For that we can iterate over valid values of x, i.e. from A to B and for each value of x iterate over valid values of y, i.e. from B to C. That enumerates all (x, y) pairs and for each such pair we can add 1 to the count of pairs with sum x+y, thus obtaining the total count of pairs per possible sum value in the end. This has a bad complexity and should be optimized.

    Note that for a given value of x, while iterating over y values, we add 1 to frequencies of all sums in the contiguous interval from x + B to x + C. Think of the desired frequency vector as a prefix array, which we will calculate later. And for now let us compute the vector whose prefix sums we are going to calculate to obtain it. To increase an interval in the prefix vector by 1, increase the element at the beginning of the same interval (index x + B), but in the original array, by 1 and decrease the element past the end of the interval (index x + C + 1), also in the original array, by 1. Iterate over values of x and do the same constant time operation just described (+1/-1) for each x. At the end compute the prefix sums vector to obtain the desired frequencies of the sums s.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +33 Проголосовать: не нравится

    After calculating frequencies of x+y sums, the z variable comes into play. For the triangle to exist and not be degenerate, x + y > z must be satisfied. (x + z > y and y + z > x are already satisfied due to the increasing order restriction from the condition.)

    Now we can either iterate over values of s=x+y and calculate how many z values from the interval C to D are smaller than the given value of s and add the count to the answer. Or we can iterate over values of z from C to D like in the editorial and calculate the number of (x, y) pairs that satisfy x+y > z for the given z, again adding up all counts. To be able to get the number of (x, y) pairs with sum exceeding z in constant time, the second prefix sum calculation mentioned in the editorial is required.

»
5 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

I got a Wrong Answer on System Testing in D. Div3, here I come :).

»
5 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Can anyone explain the solution to Problem-C? Please. Thanks in advance

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For Problem A,

I couldn't code for next 1:40 minutes

And I was like how can a problem A be so tough, because at first look it was saying that there is no way you can optimize K jumps. No log(K) or root(K) was coming to mind

then after I solved B and D. I read the lines of A again

It said calculate minDigit(a) and maxDigit(a) without leading zero, then it striked me that a zero can come in the middle digits.

And then assuming that it will happen definately and in time limit, I wrote the solution, without confirming that it will happen and it passed :)

If this problem would have been a C or something then confirming should have become mandatory (you can't wish magic happen at C) and confirming it would actually take a lot of thought in contest time!

But it took 1:40 min. What a game!

Nice Contest!!

PS: C was way tougher than D!!

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    I think comparing C and D isn't logical. D is more about thinking and proving the case and it is easy to code. While C has completely different story!!

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +20 Проголосовать: не нравится

    When I read problem A, I looked at contest name if it was div1 contest!

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Could anyone point out my mistake. My submission 80378908. I'm getting TLE

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Read about time complexity. Your code is O(K) and K can go upto 10^18. Hence this TLEs.

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      But as given in tutorial it should not take more than some 60 moves right when we condition on 0

      • »
        »
        »
        »
        5 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

        You have to condition the smallest digit to 0, not N.

        I think you are misunderstanding the tutorial a bit.

        EDIT: My bad, I misread your code. Let me check it again.

      • »
        »
        »
        »
        5 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        I think there is an issue with (int) and (long) in your code.

        In this line, int r = (int)n % 10; you're converting long to int. I think this is causing it to go into infinite loop. I haven't used JAVA but most likely issue is here.

        • »
          »
          »
          »
          »
          5 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится

          Lol thanks bro . The mistake was the int cast should be for the whole thing not for only n. Thanks again

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Please explain C sulution with exactly one cycle.

»
5 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится

I solved problem Div2E in $$$O(10^9)$$$ time, because I check each possible height. It works in 421 ms.Submission

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    How come it is working? About 3*10^7 runs in 1s, then shouldn't it be TLE?. Please correct me if I am wrong.

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +10 Проголосовать: не нравится

      This example shows, that we can complete $$$10^9$$$ operations of addition and calculation maximum in time less than 1 second (0.88s). It is what I do in cycles for (int hh = s; hh <= low; hh++) and for (int hh = low+1; hh <= f; hh++) in my original solution. I sort all heights in not decreasing order and than process each segment $$$\left(h_i, ..., h_{i+1}\right)$$$ naively. It is not necessary, but I have no extra time to think during a contest (my strategy was a solve this problem in $$$O(10^9)$$$ and back to unsolved problem A next).

      In gereral words, all operations have their own cost. We have fast and simple operations like +, -, ^, |, and slow operations like % or /. For each CPU we known his clock speed (GHz). Modern Intel CPU has a $$$3.8$$$ GHz clock speed (in $$$1$$$ second). It is equal to $$$3.8 \cdot 10^9$$$ Hz. If we suppose, that one simple instruction can be executed in a few Hz, than we can complete $$$10^9$$$ such instructions, what we can see by example above.

      Why std::max also a fast instruction? Firstly, maximum of two integers can be calculated without comparison (there is a old problem on russian educational platforms to find maximum without comparison), if we will use binary representation of numbers. Even if GCC generates code with calculation of maximum with comparison, than in this for-cycles (specific behavior for this problem) branch predictor works well, because, actually, function is monotonic: we always update maximum or always keep old value, and CPU can predict a result of comparison.

      $$$3 \cdot 10^7$$$ abstract operations can spent different time and it depends on cost of operations.

»
5 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

Problem E:
Can anyone please explain why the additional breaking point (i.e the point where P>Q changes to P<Q) occurs at the mean?

  • »
    »
    5 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +20 Проголосовать: не нравится

    Because, you can rewrite some sums.

    Let $$$H$$$ = $$$\dfrac{\sum\limits_{i=1}^N h_i}{N}$$$.

    So we know, that $$$\sum\limits_{i=1}^N h_i - H=\sum\limits_{i=1}^N h_i - N * \dfrac{\sum\limits_{i=1}^N h_i}{N} =0$$$. By the defenition, $$$P = \sum\limits_{i \in X}H - h_i,$$$ $$$Q = \sum\limits_{i \in Y}h_i - H$$$, where is $$$X$$$ is the set of indexes $$$i, h_i \leq H$$$, and set $$$Y$$$ is the set of indexes $$$i, h_i > H$$$.

    $$$\sum\limits_{i=1}^N h_i - H = Q - P = 0 \Rightarrow Q=P$$$

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Is there any other more intuitive way for proving for the case S<2*N in D?

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    i did it as follows: if u need length n try to fill the array with ones except for the last position for example if n = 5 and sum = 10 the the array will be 1 1 1 1 6 at this case if k = 5 then u win then u need k to be more than the sum of ones and less than the last number. let the last number t, t = S — (n — 1) = S — n + 1 then t — (n — 1) >= 2 S — n + 1 — (n — 1) >= 2; S — 2n + 2 >= 2 S — 2n >= 0 then S >= 2n hope it helps

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

      it does not prove anything.

    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      It does proof for the general case. you have to show that for any combination of numbers it is not possible......Here you are proving for a particular combination.

»
5 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится

Problem C can also be solved by finding valid solutions of the inequality x + y > z. Add a dummy variable d to get the equality x + y + d = z and remove the invalid solutions from the valid ones. Check this out.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    I did using presums but this method seem simpler. Can you explain the two lines in the for loop, I mean how you count for a particular value of $$$z$$$

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Let's start with the inequality x + y > z itself. If we find the number of solutions of the equation x + y <= z, then we can get the answer by subtracting it from total combinations of x and y i.e. (B - A + 1)*(C - B + 1).

    We know how to find the number of non-negative integral solutions of the equations of the kind a1 + a2 + ... + ar = n. So to reduce our inequality to get an equation like above, we need to get rid of the <= symbol by adding a dummy variable d. Now we have the equation x + y + d = z. But there is still a problem. Variables x and y can not be non-negative. To achieve this, we replace x with X + A and y with Y + B.

    Now our equation looks like this X + Y + d = z - A - B. So the number of solutions for this equation(without taking into account the upper limits of X and Y) is $$$\binom{z - A - B + 3 - 1}{3 - 1}$$$. Now to remove the solution where x >= B + 1 or X + A >= B + 1, we can replace X with (B — A + 1 + dx) to get the equality dx + Y + d = z - 2*B - 1. It has $$$\binom{z - 2*B - 1 + 3 - 1}{3 - 1}$$$ solutions. Do the same for Y. Thus total number of solutions for a given z becomes: (B — A + 1)*(C — B + 1) — ($$$\binom{z - A - B + 3 - 1}{3 - 1}$$$ — $$$\binom{z - 2*B - 1 + 3 - 1}{3 - 1}$$$ — $$$\binom{z - A - C - 1 + 3 - 1}{3 - 1})$$$. Hope it helps:)

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Your solution seems good, but isn't there double counting when you are taking dx + Y + d = z-2B-1 and X+dy+d = z-A-C-1 separately.
      Like it means in eqn(1), you may have cases like X>=B-A+1 with Y>=C-B+1 or Y<C-B+1
      likewise in eqn(2), you may have cases like Y>=C-B+1 with X>=B-A+1 or X<B-A+1.
      In both the cases, Y>=C-B+1 & X>=B-A+1, so aren't you double subtracting somehow.

»
5 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Another solution for problem D:

Make the array consisting of (n-1) 1s and then the last element would therefore be (s-(n-1)). Now simply check if there exists a number which is greater than n-1 and is less than (s-(n-1)). That number, if it exists will never be achieved by summing any of the subrarrays.(Why? Give it a thought!). For the case of n=1, s must be more than 1 and then one valid value of K is 1. For the rest, the answer is NO :)

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

My python3 solution for young explorer div2 B gol tle ,it has passed pretest ,I didn't even sorted ,is this wrong ? Kindly look into this solution[submission:80341292]- https://codeforces.me/contest/1355/submission/80341292

»
5 лет назад, # |
Rev. 3   Проголосовать: нравится +6 Проголосовать: не нравится

Another solution for E since the cost function has a local minima we can just use the simple binary search to find the local minima submission

»
5 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Although this isn't required as the editorial already explains everything about D. But here is an easy way to look at it. Let's just say you have N and S and you start off by putting 1 in each of the (N-1) places and the last place with (S-(N-1)).

1---1---1---1---1---(S-(N-1)). Let's prove that the answer is NO for the case when S<2*N. for simplicity let's take a case N=8 and S=15 1--1--1--1--1--1--1--8 now it's easy to see that the first (N-1) subarrays will fetch all the sums from 1 to (N-1). Now S-(N-1) is nothing but N(or greater than N). Include last element in the subarray and start constructing possible sum and you'll see that it will cover all the sum till S.

»
5 лет назад, # |
  Проголосовать: нравится -22 Проголосовать: не нравится

This was my solution for problem B can any help me where I am making a mistake here

include<bits/stdc++.h>

define ll long long int

using namespace std; int main() { ll t; cin>>t; while(t--) { ll n; cin>>n; ll arr[n]={0};ll ans=0; for(ll i=0;i<n;i++) {cin>>arr[i];} sort(arr,arr+n); for(ll i=n-1;i>=0;i=i-arr[i]) { if((i+1)>=arr[i]) ans++;} cout<<ans<<"\n"; }

}

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

WEAK PRETEST for B. I got TLE in contest submission in system testing. When I used my Fast IO template accepted verdict. Now I can do nothing but weep.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me with the editorial of Div2 B ??

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    what exactly you dont understand. look at someone's solution first maybe that will help

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me with an issue I have? For problem B if I run the test case 1 1, it shows the answer 1 as it is supposed to on my machine. But the output when I submitted it was 2 apparently and I ended up getting Wrong Answer. Here is a link to my code :

https://pastebin.com/XP6ZzDui

Thanks in advance

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

does anyone passed B with python? thanks!

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone simplify the proof for solution D? The editorial is hard to understand :/

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Just Imagine an array consisting of all 1's except for the last element. 
    Now our last element must be (total_given_sum-1's_so_far) and our (k is size_of_array). Eg 4 7; 
    - 1 1 1 4 will be the array as per our algo. 
    - k=3 but total_1's will be equal to k so answer is "NO". 
    - So, we can conclude that if total_1's is + 1 >= last_element. We wil never get answer.
    
    • »
      »
      »
      5 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Thanks for the reply. I followed a similar method during the contest but I was looking for a simpler explanation for the formal proof in the editorial.

»
5 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

Please suggest more problems like D that involve a similar prefix sums approach(adding to a segment). There was a question in a recent Div 3 which involved something similar, but I am unable to find more of those questions.

»
5 лет назад, # |
Rev. 5   Проголосовать: нравится +7 Проголосовать: не нравится

Short and Simple Solution for Problem 1355 C. Count Triangles

The min possible value of x + y is equal to a + b.

The max possible value of x + y is equal to b + c.

For all k from (a + b) to (b + c), find the number of different (x, y) pairs, such that x + y = k. This can be easily found since numbers are continuous (refer code). Let us call this array e[]. (e[k] = number of (x, y) pair such that x + y = k).

Now, for a given value of z, we have to count all possible (x, y) pairs such that x + y = z + 1, x + y = z + 2 ....... x + y = b + c. This can be found in O(1) if we maintain a suffix array for the array e[], found previously.

Now simply add all the suff[] values from index c + 1 to d + 1.

typedef long long ll;
typedef vector<long long> vl;
#define fe(i,s,n) for(int i=s;i<=n;i++)
#define fre(i,s,n) for(int i=s;i>=n;i--)
ll solution()
{
	int a, b, c, d, g = 0;
	cin>>a>>b>>c>>d;
	vl e(1e6 + 10, 0), s(1e6 + 10, 0);
	fre(i, b + c, a + b)
	{
		g = min(g + 1, min(i - (a + b) + 1, min(b - a + 1, c - b + 1)));
		e[i] = g;
	}
	fre(i, b + c, c + 1)
	{
		s[i] = s[i + 1] + e[i];
	}
	ll ans = 0;
	fe(i, c, d)
	{
		ans += s[i + 1];
	}
	return ans;
}
  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    In this whole calculation use of both the arrays can be removed also(refer code).

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    int main() {
        ll a,b,c,d;
    	ll ans=0;
    	cin>>a>>b>>c>>d;
    	for(int x=a+b;x<=b+c;x++){
    		if(x<c) continue;
    		ans+=max(0LL,min(x-b,b)-max(x-c,a)+1)*(min(x-c,d-c+1));
    	}
    	cout<<ans<<'\n';
    }
    
  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Can you explain me this expression: g = min(g + 1, min(i — (a + b) + 1, min(b — a + 1, c — b + 1)));

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Let's assume a = 5, b = 6, c = 9, d = 15

      The value of x + y will be in the range (5 + 6, 6 + 9), inclusive, i.e., (11, 15).

      Now write down all the (x, y) pair which satisfies x + y = 11. We can find only one such pair — (5, 6).

      (x, y) pairs for other cases are :-

      x + y = 12 -> (5, 7), (6, 6)

      x + y = 13 -> (5, 8), (6, 7)

      x + y = 14 -> (5, 9), (6, 8)

      x + y = 15 -> (6, 9)

      Observation 1

      It is clear that the maximum number of (x, y) pair for any fixed value of (x + y) is always less than or equal to (b — a + 1) and (c — b + 1), i.e., the count of numbers that x can take and the count of numbers that y can take, respectively.

      Observation 2

      The minimum possible value of x + y is m and maximum possible value of x + y is M. (where m = a + b, and M = b + c)

      Then, for x + y = m and x + y = M, there'll be at most 1 (x, y) pair each. For example :- for x + y = 11, and x + y = 15, we can have at most one pair i.e., (5, 6), (6, 9) respectively.

      For x + y = m + 1 and x + y = M — 1, we can have at most 2 pair.

      Similarly for x + y = m + k and x + y = M — k, we can have at most k + 1 pair.

      So, we've found 2 conditions that'll help us determine the number of (x, y) pairs such that x + y = m + k :-

      1) No of (x, y) pair such that x + y = m + k, will always be less than or equal to min(b — a + 1, c — b + 1).

      2) No of (x, y) pair such that x + y = m + k, will always be less than or equal to k + 1.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone tell why I'm getting memory limit exceeded in problem A.

https://code.sololearn.com/cK5Ie6MoP594/#cpp

»
5 лет назад, # |
  Проголосовать: нравится -13 Проголосовать: не нравится

E and F were like, at a different level compared to the first 4 problems!

(Luckily it's unrated cause I could not AC D during the contest :( )

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I did this solution for B using PyPy 3: https://codeforces.me/contest/1355/submission/80386227

it passed the protests but TLE'd test case #26 after system testing I did the same code in CPP , and it ran flawlessly: https://codeforces.me/contest/1355/submission/80387439

What is my mistake...

»
5 лет назад, # |
  Проголосовать: нравится +111 Проголосовать: не нравится

 )

»
5 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится

I didn't get the part where in the proof of D it says " and for prefix sum M let's mark all the numbers of the form M+TS for integer T≥0." I can't get a clear intuition on it. Please anyone help.

Thanks in advance.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can someone explain where i am wrong in ques c? solution: https://codeforces.me/contest/1355/submission/80358781

»
5 лет назад, # |
  Проголосовать: нравится +24 Проголосовать: не нравится

C can be solved without prefix arrays. Perhaps the following approach is more intuitive for some, at least for me it was.

Iterate over potential values of the sum s = x + y, which are larger than at least one possible value of z, i.e. from max(C + 1, A + B) to B + C. For each such value s:

  • Find the lowest allowable value of x: lowest = min(B, max(A, s - C)),
  • and the highest one: highest = max(A, min(B, s - B)).
  • For given values of s and x, y is fixed too. Hence the number of (x, y) pairs with sum x+y is equal to the number of x values between the found bounds: xyPairs = highest - lowest + 1.
  • Find the number of values of z lower than s: nrZ = min(s - C, D - C + 1).
  • Finally, add the obtained number of triangles equal to xyPairs * nrZ to the total answer.
  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Thanks for sharing this approach. I was having a bit trouble in understanding the approach using prefix sums, but this approach is really easy to understand.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

After seeing the prefix sums solution of problem C, I feel, it wasn't that difficult.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Those who solved D during the contest, what was your thought process?
How did you guys arrive at conclusion stated in editorial?

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится

    I had a slightly different approach. First I experimented with arrays of length 4, to see for which S it is possible to win. It was clear that things like 123x are not a good idea, as 123 immediately forms sums from 1 to 6. Instead, I thought it is better to have 111x — then first three numbers form only sums from 1 to 3, moreover, the only other two sums would be x and x+1. This led me to a conclusion that if I make array 111(S-3), then if S-3 >= 5, I can set K = 4. This generalizes to any N and S >= 2N: array 11...1(S-N-1) and K = N leads to a win.

    I did not attempt to prove that for S < 2N it is impossible to win. Intuitively, N numbers with sum < 2N will consist of a bunch of 1s and 2s, and maybe a few big numbers. But with a large number of 1s and 2s it is clearly possible to get any sum from 1 to their total sum, so it is very likely that any sum up to S will be achievable.

»
5 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Can anyone please explain the problem C using offline range update

»
5 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

nice problem and ideas but i think div.2 A must be easier.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can someone explain me why in problem A author has taken this X=1000(⌊a1/1000⌋+1) and whats its use??

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    X is used to prove that given any a1, ai will have a 0 in one of its digits.

    If we assume that ai goes to infinity as it will never have a 0, then we can use X as just an arbitrary number between some ai and ai+1 (X cannot be in the sequence because 1000([a1/1000]+1) always has a 0 in the hundredths place).

    Because ai+1 cannot have a 0 (in the hundredths place), then ai+1 is at least X + 100. However, ai < X. Therefore, ai and ai+1 have a difference of more than 100, which is impossible as the max difference between any two elements is 81.

»
5 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Why aren't setter's and tester's solution link provided in editorial ? DishonoredRighteous

I need the implementation of problem C's editorial to understand it better.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by DishonoredRighteous (previous revision, new revision, compare).

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

am i the only one not able to see the authors solution for problems ?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by DishonoredRighteous (previous revision, new revision, compare).

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I get 'you are not allowed to view requested page' when clicking on authors solutions. How to fix this?

»
5 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

For C we need all x + y > z. x,y,z are the three sides of triangle.

Go over each x (a <= x <= b) and make a pref[] array to store the total values that make exactly sum value i. for each x you can make values from x + b to x + c. Don't add them using a for loop instead use difference array. so pref[x + b]++,pref[x + c + 1]--.

Now sum up the values pref[i] += pref[i — 1]. This will give you an array consisting all values u can make sum i using x and y where (a <= x <= b) and (b <= y <= c).

But we don't need the values that make this sum exactly, instead we need the toatal values greater than or equal to this value that can be made using some x and y. so make suffix sum of it. pref[i] += pref[i + 1].

Now all set. We go through each z and get the total numbers greater than or equal to z that can be formed using x and y. which is pref[z + 1]. do this for (c <= z <= d).

add them in a for loop.

Overall Complexity( O(a) + O(b + c) + O(d) ).

»
5 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

After seeing editorial for Problem A. I think, I was better off with no editorial.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In D problem the test case 3 4 answer is NO but if we write array as 0 0 4 and k as 3,then Petya wins, are we allowed 0 in the array, because that would make this problem really easy and this is not written anywhere(i think, sorry if i missed somethin)

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    2nd line of the question: "At the beginning of the game Petya has to come up with an array of N positive integers".

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Hi DishonoredRighteous. Could you explain why you use X=1000(⌊a1/1000⌋+1) in Problem A demonstration ? Thanks

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    It's just the next number to X where last three digits are equal to zero. It's easy to use such number for proof. Of course we can take some other number which has last three digits zero.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Подскажите, пожалуйста, почему два раза нужно находить prefix sum в задаче C?

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Сначала мы выполняем прибавление единицы на отрезке в offline. Это делается так. Пусть мы хотим прибавить на отрезке $$$[l; r]$$$. Тогда заведем массив, в котором прибавим единицу к элементу $$$l$$$ и вычтем единицу из элемента $$$r + 1$$$.

    Если после всех запросов посчитать префиксные суммы получившегося массива, мы получим массив, в котором выполнены все прибавления на отрезках. После этого нам нужно будет в этом массиве уметь искать сумму на подотрезке. Для этого еще раз посчитаем префиксные суммы.

»
5 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

The prefix-sum approach for solving div2c is amongst the most beautiful and elegant things ive even seen

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Hi, I am not able to understand the approach, can you help ?

    • »
      »
      »
      5 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      suppose you keep an array number[ ] that keeps track of how many times s=x+y can be calculated. no say x goes from 1 to 2 and y goes from 2 to 4. so x+y can range from 2+1=3 to 2+4=6. now, one way to calculate can be iterate through the possible values of x and for each x add 1 to all elements ranging from number[x+2] to number[x+4]. but this approach is to slow and almost O((B-A).(C-B)).

      Now one thing you could do is, iterate through all values of x and for each x, add one to number[x+2] and subtract one from number[x+4 +1]; so:

      x=2----> number[] = 0 0 0 1 0 0 -1 0 0 0....
         x=3----> number[] = 0 0 0 1 1 0 -1 -1 0 0....
         x=4 ---->number[] = 0 0 0 1 1 1 -1 -1 -1 0...

      you could do this in O(B-A) steps.

      then calculate a prefix sum of the number array. that is iterate over the entire array and define number[i] = number[i-1]+number[i];

      now number[] = 0 0 0 1 2 3 2 1 0 0 ........

      which is the same result we would get if we had calculated the number array by iterating all possible values of y for each possible value of x.

»
5 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

I can't understand the proof of s < 2n in the second paragraph?Can someone explain it?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

can anyone please explain the proof in more details of why if S<2N petya will lose

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Anyone got the output for First Question using java, for some reason I am getting timeout.

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    The input $$$k$$$ can be a huge value. Your loop while(k-->1) {... will loop $$$k$$$ times, which simply takes to much time.

    The expected solution to this problem is finding a way to make this loop run less than $$$k$$$ times.

»
5 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Can C solve in O(1)?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

C solution with fft: 80351725.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In A question this constrain is too large 10^16 & 10^ 18 how it able to pass in 0(n)

  • »
    »
    5 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    $$$O(n)$$$ solutions fail on this problem since $$$n$$$ might be huge. Aside of that you are expected to read the editorial.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I think problem E can be easily solved by binary search like this https://codeforces.me/contest/1355/submission/80432019

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone explain me how to solve 1355C using prefix sums??

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

in question E, can anyone tell why the additional breakpoint is to be considered separately, and how to think of that case while solving the question during the contest ? thanks in advance.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In problem E, can someone help me prove that only one global minima point for the cost function will exist over the whole range of height? Can't there be many local minimas instead?

Thanks in advance

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone please explain the proof of D? I don't understand why there's a segment with sum $$$K$$$ in the cyclic array if $$$X$$$ and $$$X + K$$$ have been marked. Isn't it possible that the two prefix sums used to mark $$$X$$$ and $$$X + K$$$ had $$$S$$$ added to them a different number of times? If so, how does it imply the segment formed by the end points of these two prefixes has sum equal to $$$K$$$?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I can't understand the formal proof of problem-A ,Any help??

»
5 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Problem C could be solved in $$$O(1)$$$.

Let us suppose that $$$x=B-a,y=C-b,z=C+c$$$, where $$$0 \leq a \leq B-A, 0 \leq b \leq C-B,0 \leq c \leq D-C$$$.

Since $$$B-a+C-b>C-c$$$,we have $$$a+b+c<B$$$.

Then we can use Inclusion-Exclusion Principle(just a classic application).Specifically, just enumerate all subset of these three elements, suppose they are much too large (eg. a>B-A).

see code for more details 80326731

»
5 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

In problem F, we need no more than 20 queries to find the answer for X1, but how about X2?

Shouldn't the queries for X2 be caculated?

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I can't understand why solution for D is correct. Why always pick k = 1(considering Vasya plays optimally)? For example if you pick K = 2 and you chose one element that is = 2 the solution is not correct.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I really hate that problem c -_-

»
5 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Here's an explanation for D, if you haven't understood it from the editorial.
Let the prefix sum array be $$$M = { M_1, M_2, .., M_n}$$$.
All the elements in this array are unique and $$$\leq$$$ S as we are adding a positive number at each step.

Let $$$M' = (M_1+k)\%S, (M_2+k)\%S, .., (M_n+k)\%S$$$.
Elements in this array are unique as well and all are < S due to modulo.

If k=0, it is trivial. Suppose k>0.
If $$$M'_i = M_j$$$, then either $$$M_j = M_i+k$$$ or $$$M_i+k = M_j+S$$$.
If $$$M_j = M_i+k$$$, then j > i, segment from i to j has a sum = k.
If $$$M_i+k = M_j+S$$$, then j < i, segment from j to i has sum = S-k.

So there is no solution if $$$S \lt 2n$$$ as there should $$$2n$$$ unique elements($$$\neq k$$$ and $$$\neq S-k$$$) $$$\leq$$$ S and this is not possible. We don't know whether $$$S \geq 2n$$$ has a solution or not, but the construction in the editorial shows that it is always possible.

»
5 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

If anyone need detail explanation for div2 C Here

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Used a lot of time writing 17 queries solution for Problem F.

https://codeforces.me/problemset/submission/1355/80821530

I think 22 is a good bound for contest.

»
5 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Problem E is same as https://www.spoj.com/problems/KOPC12A/


It already has more than 1000 accepted on SPOJ. It's expected in educational rounds not in normal rounds.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For problem D,suppose n=3 and s=5...the answer according to the editorial is "NO" but if we take the array [2,1,2] and K=4 the answer shall be "YES".

  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    You can take a sum of subarray S — K = 1. The 2nd element of your array is 1, so Petya loses.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For C, we may simply do this:

Iterate over all possible values s of x + y. We need z <= min(D,s-1) and z >= C. Thus there are exactly n1 = C — min(D,s-1) + 1 possible values of z.

Now it remains to count how many x, y satisfy x + y = s. We need a <= x <= b, and b <= s- x <= c. The size n2 of the intersection of these intervals is precisely the number we need. We then add n1*n2 to the answer.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I really loved the explanation for problem E. I hope codeforces editorial are like these most of the time.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

For Div2C, a blog.

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Let's now assume that P≥Q, we have exactly X pillars with no more than H bricks and exactly N−X pillars with strictly more than H bricks. Let's try to increase H by 1 and see how the total cost will change. P′=P+X,

Can someone please explain this with example?

»
3 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

1355C has on solution of O(1) and O(1).
Split [B,C] to three: [B,b_0], [b_0+1, b_1], [b_1+1, C].
Here, B,b_0,D can, B,b_0-1,D cannot; A,b_1,D can, A,b_1-1,D cannot.
seg0

private static long Segment0(int A, int B, int C, int D, int b_0, int b_1)
        {
            if (b_0 < B)
            {
                return 0;
            }
            var b_min = C - B + 1;
            if (b_min < B)
            {
                b_min = B;
            }
            if (b_min > C)
            {
                return 0;
            }
            var b_tmp = C - A +1;
            if (b_tmp > b_0)
            {
                b_tmp = b_0;
            }
            if (b_tmp < b_min)
            {
                b_tmp = b_min-1;
            }
            var res = 0L;
            if (b_min <= b_tmp)
            {
                var cnt = b_tmp - b_min + 1;
                var val1 = B + b_min - C;
                // (1 + val1 + i)(val1 + i)/2
                // = (1 + val1)val1/2 + i* val1 + i(i+1)/2
                res += (long)(1 + val1)*val1 / 2 * cnt;
                res += (long)val1 * (cnt - 1) * cnt/2;
                res += (long)(cnt - 1)*cnt*(cnt+1)/6; 
            }
            if (b_tmp < b_0)
            {
                var cnt = b_0 - b_tmp;
                var val1 = B + b_tmp + 1 - C;
                var tmp = B-A +1;
                // (val1*2 - tmp + 1 + i * 2)*tmp/2
                res += (long)tmp * ((val1*2 - tmp + 1) + cnt - 1) * cnt /2;
            }
            return res;
        }

seg1

private static long Segment1(int A, int B, int C, int D, int b_0, int b_1)
        {
            if (b_1 - b_0 <= 0)
            {
                return 0;
            }
            var b_tmp = C - A +1;
            if (b_tmp < b_0)
            {
                b_tmp = b_0;
            }
            var res = 0L;
            var val1 = D - C + 1;
            if (b_tmp > b_0)
            {
                var cnt = b_tmp - b_0;
                // (val1 + 1)val1 / 2
                res += (long)(val1 + 1) * val1 / 2 * cnt;
                var tmp = B - (D - b_0);
                // val1 * (tmp+i)
                res += (long)val1 * (tmp * 2 + cnt -1) * cnt /2;
            }
            if (b_1 > b_tmp)
            {
                var cnt = b_1 - b_tmp;
                var tmp = (D - b_tmp) - A + 1;
                // (val1*2 - tmp + 1 + i) * (tmp - i)/2
                // (val1*2 - tmp + 1) * tmp + (tmp -val1)i - i(i+1)/2
                res += (long)(val1*2 - tmp + 1) * tmp/2 * cnt;
                res += (long)(tmp - val1) * (cnt -1) * cnt /2;
                res -= (long)(cnt - 1)*cnt*(cnt+1)/6;
                // val1 * (B - A + 1 - tmp + i)
                res += (long)val1 * ((B - A + 1 - tmp) * 2 + cnt -1) * cnt/2;
            }
            return res;
        }

seg2

private static long Segment2(int A, int B, int C, int D, int b_0, int b_1)
        {
            if (b_1 >= C)
            {
                return 0;
            }
            return (long)(B-A+1)*(D-C+1)*(C-b_1);
        }