9

Codeforces Round #817 (Div. 4) Editorial

 1 year ago
source link: http://codeforces.com/blog/entry/106478
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
By flamestorm, 20 hours ago, In English

Thanks for participating!

1722A - Spell Check

Idea: mesanu, MikeMirzayanov

Tutorial
Solution

1722B - Colourblindness

Idea: flamestorm

Tutorial
Solution

1722C - Word Game

Idea: flamestorm

Tutorial
Solution

1722D - Line

Idea: flamestorm

Tutorial
Solution

1722E - Counting Rectangles

Idea: mesanu

Tutorial
Solution

1722F - L-shapes

Idea: MikeMirzayanov

Tutorial
Solution

1722G - Even-Odd XOR

Idea: mesanu

Tutorial
Alternate Tutorial Sketch
Solution

20 hours ago, # |

Rev. 2  

0

I didn't even think that Timur is lexicographically in order. What a brilliant solution!

Edit: It isn't, but it's still an interesting solution to think of.

    • 20 hours ago, # ^ |

      It should be Timru

    • 19 hours ago, # ^ |

      Rev. 2  

      +21

      i... totally knew that, good reading comprehension, well done, you passed the test

      • 11 hours ago, # ^ |

        there should be "Timru" instead of "Timur" in the editorial solution

        • 7 hours ago, # ^ |

          it is sorted afterwards , so eventually it is Timru only

          • 112 minutes ago, # ^ |

            Timru

20 hours ago, # |

Problem D can also be solved in O(n) using two pointers

  • 20 hours ago, # ^ |

    exactly

  • 19 hours ago, # ^ |

    Can you give your solution here it would help

    • 19 hours ago, # ^ |

      here if you need explanation feel free to ask

      • 18 hours ago, # ^ |

        Hello, I saw your solution but I didn't understand this line . What is it for > for (k;k<=n;k++) ans[k]=s;

        • 12 hours ago, # ^ |

          let's suppose that it was already optimal like RRLL so in the line you mentioned it just sets the remaining indexes (which could not be covered in while loop cuz of being optimal) they will just get the previous value as we will not be changing them...

          • 6 hours ago, # ^ |

            Thank you.

        • 10 hours ago, # ^ |

          Let's say the number of characters I needes to change was 8 and n is 10. I need go give an answer for all k such that 1<=k<=n so I just output for the remaining k

          • 6 hours ago, # ^ |

            I got it. Thank you so much.

            • 6 hours ago, # ^ |

              You're welcome

        • 10 hours ago, # ^ |

          Rev. 2  

          0

          Check out my submission for problem D it might help you understand you the two pointer approach bettetb

  • 19 hours ago, # ^ |

    I solved it in O(n) aswell, but using prefix array

    170271299

  • 13 hours ago, # ^ |

    Yes, I solved it in the same way.

    here

  • 7 hours ago, # ^ |

    What is two pointer approach... Can you share some resources from where I should learn... It would be a great help

    • 6 hours ago, # ^ |

      Check Codeforces edu section. You can also read about it on USACO Guide

    • 3 hours ago, # ^ |

      Rev. 2  

      0

      Two pointer is basically using two indices to traverse through an array on the basis of some condition that you can apply on both the pointers(pointing to a particular index), like in the D part of the question we take one pointer at very start and one pointer at very end of the array and then we can check if we got a left viewer with first pointer then changing it to R will give a better score till n/2-1 and checking the same thing for the right pointer for the right side viewer till n-n/2, we can do this till left pointer is less than right pointer.

      To understand two pointers you should try solving problems for it instead reading about it, this link will work for basic problems Two pointers and problems on it

  • 6 hours ago, # ^ |

    i do it with queue :)

    • 6 hours ago, # ^ |

      It can be done too, because there indices that must be changed before others right?

19 hours ago, # |

Why is problem A O(n)O(n)? You check if n=5n=5 in O(1)O(1); If it is, then sort the string which in this case will always have length n=5n=5 so sorting and checking is done in O(1)O(1) (since the length is upper bounded). So overall O(1)O(1), or am I missing something?

  • 19 hours ago, # ^ |

    Rev. 3  

    0

    I think that's true. Change it, flamestorm.

    • 15 hours ago, # ^ |

      You check if "T" is in the string, that can be done in O(1)O(1) (since it only has 5 elements). Then you check if "i", also O(1)O(1) And so forth. In total 5⋅O(1)=O(1)5⋅O(1)=O(1)

19 hours ago, # |

Rev. 2  

+38

problem G:

topic 1

Regardless of your correct answer, when you choose some elements and take their XOR, then the value will be equal to the XOR of the remaining elements. Why?
Sample: (4,2,1,5,0,6,7,3)(4,2,1,5,0,6,7,3) is one of answer for n=8n=8, and 4⊕0⊕3=2⊕1⊕5⊕6⊕7=74⊕0⊕3=2⊕1⊕5⊕6⊕7=7

Answer
topic 2

There exists a randomized solution.

Explanation
topic 3

For 3≤n≤63≤n≤6, the answers are provided in the sample, so let's use them as a prefix.

  • n≡0mod4n≡0mod4 then prefix = (2,1,3,0)(2,1,3,0)
  • n≡1mod4n≡1mod4 then prefix = (2,0,4,5,3)(2,0,4,5,3)
  • n≡2mod4n≡2mod4 then prefix = (4,1,2,12,3,8)(4,1,2,12,3,8)
  • n≡3mod4n≡3mod4 then prefix = (2,1,3)(2,1,3)

After that, add (100,101,102,103,…)(100,101,102,103,…) until the length of the sequence becomes nn. (note that the length of added sequence is a multiple of 44 ) Then, you can get a correct answer.
Submission: 170321109

Why?
  • 14 hours ago, # ^ |

    master piece. i tried to construct a solution similar to topic 3, but unfortunately fell into tons of case work.

    however, instead we can take advantage of samples, XD

  • 9 hours ago, # ^ |

    Rev. 2  

    0

    thanks a lot!!

  • 3 hours ago, # ^ |

    Thanks alot. Can you share the proof of topic 3 ?

    • 3 hours ago, # ^ |

      proof with an example
      • 2 hours ago, # ^ |

        That's great! Thanks alot.

19 hours ago, # |

The latex for 230230 is bugged in the tutorial of problem G.

Aside from that, problem G is a really cool problem!

19 hours ago, # |

For anyone who is finding the solution of problem F, hard to understand/code, can take a look at my solution using DFS 170297341

18 hours ago, # |

D can be solved using two pointers.

The main idea is that the first half of the line should look to the right and the second half to the left. We keep two pointers l and r on both ends and recalculate the sum whenever we encounter a position that needs to be changed.

18 hours ago, # |

Can we solve problem E using binary search?

  • 18 hours ago, # ^ |

    should give a TLE or difficult to pass since for every query you will traverse all 1000 (x) and BS for (y)

    which will give "1e5 * 1000* log(1000)"

  • 16 hours ago, # ^ |

    I did it this way because I didn't know about 2d sum prefixes. You need to keep a sorted 2d array, and then another 2d array of sum prefixes for 1..1000. Then you do two binary searches on the ranges to get your start and end.

    It was slow but I passed using Go at 3500ms.

    • 10 hours ago, # ^ |

      May be that will fail system testing.

      • 5 hours ago, # ^ |

        It did TLE. I also solved with same approach and it TLEd.

      • 62 minutes ago, # ^ |

        Yup you were right.

        • 30 minutes ago, # ^ |

          Mine Problem C was also hacked due to TLE I used a very dumb method to solve that initially.

  • 2 hours ago, # ^ |

    I got TLEd for that

18 hours ago, # |

Good contest, got sidetracked by D by trying to use two pointers. Your solution is much more elegant.

18 hours ago, # |

Rev. 2  

+17

Weak pretests for A , so many solutions got hacked.

  • 16 hours ago, # ^ |

    Your solution is weaker

    • 12 hours ago, # ^ |

      Agreed and that's a pity that such a solution passed.

17 hours ago, # |

How to write the code for Problem G with the alternate tutorial, I am unable to understand the approach

  • 17 hours ago, # ^ |

    underStood

17 hours ago, # |

Rev. 2  

-9

Simple implementation for problem G

void solve()
{
    int n;
    cin >> n;

    int xorr = 0;
    vector<int> ans;
    for (int i = 1; i <= n - 2; ++i)
    {
        ans.push_back(i);
        xorr ^= i;
    }
    if (xorr != 0)
    {
        ans.push_back(1 << 30);
        ans.push_back((xorr) ^ (1 << 30));
    }
    else
    {
        /*

        The maximum xor of all the elements from 1 to n-2 or n-3 will be less than 2**21.
        (So, you can choose any power of 2 from [21, 30) and replace n-2 with it)
        If we have XOR([1...n-2]) as zero, we can remove (n-2) and can push (1<<21)
        And now the XOR([1....n-3, (1<<21)]) will be some number having the 21st as set

        Now, we just need two more nos, that can be (1<<30) and XOR([1...n-3, (1<<21)])) ^ (1<<30)

        */
        xorr ^= (n - 2);
        ans.pop_back();
        ans.push_back(1 << 21);
        xorr ^= (1 << 21);
        ans.push_back(1 << 30);
        ans.push_back(xorr ^ (1 << 30));
    }

    for (auto &i : ans)
    {
        cout << i << " ";
    }

    cout << nline;
}

16 hours ago, # |

Rev. 3  

-6

Problem F can be done using

Surprise !
  • 10 hours ago, # ^ |

    That’s what I did lmao

15 hours ago, # |

Rev. 2  

0

I had school so I wasn't able to do the contest, however I've solved them all and I present my solutions. They may or may not be worse quality than the official editorial.

A
B
C
D
E
F
G
  • 11 hours ago, # ^ |

    Can you please tell me where my submission 170342106 for problem E is failing?

    • 11 hours ago, # ^ |

      I think your code is quite overcomplicated

  • 9 hours ago, # ^ |

    tgp07 Excellent editorial, better than official one! Could you please tell me if there is a way to solve E under the same time constraints for tighter dimensions of the rectangle say 1e5 or 1e9 or even higher?

    • a moment ago, # ^ |

      That would be a lot tougher. I'm not immediately sure of any way to solve that.

  • 8 hours ago, # ^ |

    your G one is really good Thanks for sharing.

13 hours ago, # |

Why I am getting runtime error in problem C .Here is my solution

  • 6 hours ago, # ^ |

    Take a look at Ticket 16132 from CF Stress for a counter example.

13 hours ago, # |

My first contest solving more than 1 problem :) I was excited to realize I could use a max heap to solve problem D.

11 hours ago, # |

Can anyone tell me a testcase where my submission 170342106 is failing for problem E?

  • 6 hours ago, # ^ |

    Take a look at Ticket 16131 from CF Stress for a counter example.

10 hours ago, # |

What's hack ??! In the verdict of my submission it's written as hacked but earlier it was accepted any one care to explain what this hack is ??!

  • 10 hours ago, # ^ |

    Some of the corner test cases are not added while you submit the solution. And if you have not handled those cases and someone else break your code for any of those test cases means your solution is hacked .

10 hours ago, # |

Damn. I was not getting what was going wrong in the first question. Used a if condition, which updates a count and individually checked the letters with T i m u r. But, it gave me wrong results. If i had not lost time on this, 5 questions were quite easy to do

10 hours ago, # |

When will my rating appear, yesterday was my 1st contest.

  • 9 hours ago, # ^ |

    For div2, preliminary ratings are updated in 2-3 hours. For education rounds/Div 3/Div 4, we have an open hacking phase which lasts for 12 hours so yeah, expect waiting for atleast 18 hours.

    • 8 hours ago, # ^ |

      bro I am new here.Can you tell me what is this open hacking phase?

      • 8 hours ago, # ^ |

        In div3/4 and Educational round, we have an open hacking phase for 12 hours. This means you can view others' code and find a test case where their code fails. If you hack their solution, the system will use this test case provided by you after these 12 hours during the system test (after which we get our final result, I hope you know the difference between system test and pretests). Hacking others won't give you extra points in the Edu round or Div 3/4. The only purpose of Open hacking phase is to promote hacking others' solutions and to understand others' writing styles. Hacking others will give you extra points in Div 2/1. To know more in detail, please use the codeforces search box. Searching is a good habit when on the path to becoming a competitive programmer. All the best!

        • 8 hours ago, # ^ |

          @nikhilofindia thanks bro

    • 8 hours ago, # ^ |

      usually div. 3 gets preliminary rating updates by now right?

      • 8 hours ago, # ^ |

        Rev. 3  

        0

        Max to Max 5PM IST (from what I have experienced) This is worst case.

        Edit: Looks like we have a new worst

9 hours ago, # |

Rev. 6  

0

Hey!, can someone help me up solving question F,

My logic for the solution was that for each * there can be only and only 2 '*' neighbors in all 8 directions(if a cell exists there) no more, no less than that.

But it fails on test no. 4, 69th ticket. can someone help me find a test case where this fails. WA link — https://codeforces.com/contest/1722/submission/170290140

Any help would be very appreciated.

  • 9 hours ago, # ^ |

    Check out my solution maybe it’ll help you

    • 7 hours ago, # ^ |

      Thank you, nice code

  • 9 hours ago, # ^ |

    Rev. 2  

    0

    1
    3 3
    .*.
    *.*
    .*.

    • 7 hours ago, # ^ |

      Thanks a lot, how do you come up with such cases, like how do you think of cases where our code might fail, how to develop that? any tips on that would be very helpful.

9 hours ago, # |

1722A - Spell Check Hacking not done properly, go through it once

8 hours ago, # |

My idea for G : XOR of 4 consecutive numbers starting from 0 is 0. 2^20 is greater than 2e5 which gave me sufficient power of 2's to play with.
Requires just some more case work for the remaining element. Approach

8 hours ago, # |

for problem G

for n = 5,

the solution: 0 1 33554433 2 33554434

is valid or invalid???

  • 7 hours ago, # ^ |

    Can anyone please help me??

8 hours ago, # |

Rev. 2  

0

My code for C using sets concepts in maths.

t = int(input())
for _ in range(t):
    tot_words = int(input()) * 3
    s1 = set(x for x in input().split())
    s2 = set(x for x in input().split())
    s3 = set(x for x in input().split())

    only_in_s1 = len(s1 - s2 - s3)
    only_in_s2 = len(s2 - s1 - s3)
    only_in_s3 = len(s3 - s1 - s2)

    in_s1_s2_s3 = s1 & s2 & s3
    s1_s2 = len((s1 & s2) - in_s1_s2_s3)
    s2_s3 = len((s2 & s3) - in_s1_s2_s3)
    s3_s1 = len((s3 & s1) - in_s1_s2_s3)

    score_of_s1 = (only_in_s1 * 3) + (s1_s2 + s3_s1)
    score_of_s2 = (only_in_s2 * 3) + (s2_s3 + s1_s2)
    score_of_s3 = (only_in_s3 * 3) + (s3_s1 + s2_s3)
    print(score_of_s1, score_of_s2, score_of_s3)
  • 8 hours ago, # ^ |

    Funnily I completed sets chapter only yesterday.

7 hours ago, # |

Rev. 3  

0

7 hours ago, # |

Rev. 2  

0

Is it only Me or anybody else also noticed that F was comparatively easy E for those who till now havent encountered problem based on 2-D PREFIX Sum . I am feeling very frustrated as I spent more than one hour on E and also during the contest F have least successful submission so I just dont focused on F

7 hours ago, # |

problem D can also be solved in O(n) time using two pointers using a greedy approach. in the first half of the string, we can get better answer by converting the leftmost 'L' to 'R' and in the second half of the string, we can get better answer by converting the rightmost 'R' to 'L'.

link to my code — 170257607

7 hours ago, # |

Rev. 2  

0

A very simple and easy solution of G .

6 hours ago, # |

Alternate solution for Problem G:
Observe that a⊕ba⊕b==∼a⊕∼b.∼a⊕∼b. Now you can construct a sequence a0a0, ∼a0,∼a0,a1,a1,∼a1,∼a1,a2,a2,∼a2,…∼a2,…(upto n terms) where n≡0n≡0 (modmod44).
For n=4k+1n=4k+1 or 4k+24k+2 or 4k+34k+3, just take some prefixes of length 11 (0), 66 (4,1,2,12,3,8), and 33 (2, 1,3) respectively from the given testcases itself and the remaining sequence will be of length 4k′4k′.

Note that a0a0, a1a1, …… can be taken to be 13,13,14,14,15,15, ... as none of the prefixes contain elements >13>13.
Also, ∼a∼a represents 1's compliment of aa inverting all 32 bits of +a+a, although (even the first 20 bits would work considering the constraints on aiai)

6 hours ago, # |

On Problem 1722B Colourblindness I had the same Approach But still got WA on test case 3

#include<bits/stdc++.h> 
using namespace std; 
#define ll  long long;
#define vi vector<int> 
#define pb push_back
#define all(x) x.begin(),x.end()
#define rep(i,a,b) for(int i=a;i<b;i++)
 
string solver()
{
	int len;cin >> len; 
	char upper[len],lower[len]; 
	cin>>upper; 
	cin>>lower;
	rep(i,0,len)
	{
		if(upper[i] == 'R' && lower[i] != 'R')return "NO";
		if(lower[i] ==  'R' && upper[i] != 'R')return "NO";
	}
	return"YES";
}
int main(){
	ios::sync_with_stdio(1);cin.tie(0);cout.tie(0);
	#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin); 
    //freopen("output.txt","w",stdout); 
 	#endif
  int tc=0;cin >> tc;
  while(tc--)cout << solver() << endl;
  return 0; 
}

6 hours ago, # |

what is the use of greater() in the sort function of the D problem?

  • 5 hours ago, # ^ |

    Its a comparator which defines how you want it be sorted. You can read more about it here

5 hours ago, # |

In the problem E, trivial O(nq)O(nq) solution passes due TL=6sTL=6s: 170297542

5 hours ago, # |

I solved 3 problems but my rating doesn't change. my rating point is still 0point

5 hours ago, # |

Rev. 2  

0

I solved problem G quite differently from the editorial method utilising the property that XOR of consecutive numbers x and y is always 0 when x is an even number (if you didn't know this, it's easy to see why, by taking a few consecutive numbers and looking at their binary representation).

Let set a and b represent respectively the set of numbers at even positions and the set of numbers at odd positions. Then we break solution into 4 cases depending on the remainder of n on dividing by 4.

Case 1.) n%4 = 0
Case 2.) n%4 = 1
Case 3.) n%4 = 3
Case 4.) n%4 = 2

I think some of the cases can probably be combined for a simpler solution. Please let me know in the comments.

Not so elegant and repetitive implementation : 170369765

  • 5 hours ago, # ^ |

    I solved in the same way

4 hours ago, # |

Rev. 3  

0

In E, I'm getting MLE if I put prefix array in the heap memory, but the solution passing when I put the prefix array as a global array. Why is that so?

170374285

int main() {
    ll** pt = new ll*[1001];
    ll** dp = new ll*[1001];
    for(int i=0;i<=N;i++){
	pt[i] = new ll[1001];
	dp[i] = new ll[1001];
    }
   //......
}

170372939

ll pt[1001][1001];
ll dp[1001][1001];
int main(){
   //.....
}

4 hours ago, # |

A much simpler (in my opinion) and more readable solution for Problem F with necessary comments : 170377676

3 hours ago, # |

Rev. 2  

0

Another way to solve F: L-shapes:

ref: https://codeforces.com/contest/1722/submission/170380611
Note that, a 2x2 grid will contain L shape if and only if there are exactly 3 '*' in it.

1)Firstly for all 2x2 subgrid that contain L-shape, check whether its surrounding has any '*' in it, if so, then the ans is NO. [except for the corner along void position(exactly one such position) of 2x2 grid ,
eg: '#' in below picture [and ^ is void position] ]

...#
.*^.
.**.
....

2)Now the only problem is, there can also be any other shapes than L-shapes. To find that,
In logic1, just whenever current 2x2 subgrid contain L,(ie:exactly 3 '*' in it) , mark those positions as #.
So that all L shapes will be marked, and if there exist any other shape than L shape then it will remain unmarked(ie:remains *).

So, atlast traverse the whole grid to find any such unmarked position,
if so, the ans is NO,
Otherwise YES.

2 hours ago, # |

Can somebody explain solution E, I have never seen use of prefix sum like this. I dont quite get it what thay have exactly done here

  • 64 minutes ago, # ^ |

    suppose you have a data structure which stores 2D-prefix sums, such that sum of rectangles with height <= H and width <= W = pref[H][W]

    then if you wanna know the sum of areas of rectangles with height < Hb and width < Wb (condition — i) then that would equate to pref[Hb — 1][Wb — 1]

    now say you want the sum of areas of rectangles which have height <= Hs and width <= Ws(condition-ii)

    the rectangles which satisfy both condition i and ii is the required answer

    for learning about 2D-prefix sums I would suggest going through the USACO guide, they have detailed and easy to understand content, https://usaco.guide/silver/more-prefix-sums?lang=cpp#2d-prefix-sums

2 hours ago, # |

Why didn't my ratings update ? :'(

78 minutes ago, # |

My Solution for F

did the same thing as mentioned in the editorial but is easier to understand.

61 minute(s) ago, # |

The first problem can be solved with a frequency array, by calculating the frequency of each character while taking inputs. Then check whether the frequency of each character of "Timur" is equal to one or not.

58 minutes ago, # |

I got wa on F test 3 170393551 can somebody say the problem


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK