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

Автор chokudai, история, 6 лет назад, По-английски

We will hold AtCoder Beginner Contest 162.

In this contest, available languages are different from usual. Please see the bottom of this contest page for details. (Only Japanese)

https://atcoder.jp/contests/language-test-202001

The point values will be 100-200-300-400-500-600.

We are looking forward to your participation!

UPD: I apologize for the slow grading. The problem has been fixed during the contest. You'll be comfortable at the next contest.

  • Проголосовать: нравится
  • +87
  • Проголосовать: не нравится

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

Had been waiting for this for so long.

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

I recommend that you check whether your code and library work well before the contest. New languages and a new judge server were already tested in Japanese contests (https://atcoder.jp/contests/language-test-202001, https://atcoder.jp/contests/judge-update-202004 ), but some bugs may still exist.

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

Why only Japanese language?

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

What are the real names of the problem setters??

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

chokudai is there any Editorial of atcoder's contest available written in English?

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

Good luck to everyone O^O

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

That's really great, that structural binding finally compiles on Atcoder.

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

When will the solutions/code for the problems be discussed or shared? I am new to Code Forces. I really need those to improve. Thanks.

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

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

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

How to solve E ?

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

I was trying bruteforce of F in O(N*N). But it gave me the wrong answer.

Can anyone tell why this solution is giving wrong answer. Link

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

    Wont N^2 give TL?

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

    I use dp to solve F

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

      we can maintain dp[i][j], j = {0,1}

      Initially dp[2][1] = arr[2] and dp[2][0] = arr[1] (Base Case)

      1. dp[i][1] denotes maximum sum when we are at i and we are picking ith element and floor(i / 2) elements(subset of 1...i such that adjacent element are not picked).

      2. dp[i][0] denotes maximum sum when we are at i and we are NOT picking ith element and floor(i / 2) elements (subset of 1...(i — 1) such that adjacent element are not picked)

      With some work we can fill dp upto n.

      Our final answer will be max(dp[n][1],dp[n][0]) My Submission

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

      too short to understand,can you give some explanation? :D

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

        since we know already how many elements we have to take i.e N/2 so instead of using N^2 dynamic programming solution we can do it in O(N) by maintaining at each i that we have taken i/2 elements upto now and have maximum possible sum till now, since at each i we have two possiblity either pick that element or don't pick it.

        We have two cases to handle when i is odd and i is even

        1. when i is odd and we want to pick ith element we can build a current state from (i — 2)th and (i -3)rd state because we know we have already calculated answer for (i/2) — 1 element up to (i — 2) and (i — 3) so that after adding total elements become i/2.

        And if we don't pick ith element we have to construct answer so that total element chosen is i/2 and sum is maximum we can construct answer by taking arr[i — 1] and help from states (i — 1),(i — 2),(i — 3) (for arr[i — 1] only these are possibility can you see why???) and also by using arr[i — 2] and help from state (i — 3) (for arr[i — 2] only this is possible). You don't have to consider other elements and states because you cannot build current state having i/2 elements.

        1. Similarly for even but possiblity for even i's are less than that of odd i's you can think about it.
  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    Your solution might underflow, check the testcase where every value is negative.

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

Video tutorials for this contest

Also, F is this JOI task, which helped me a lot to win the contest

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

how to E ?

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

I solved problem D in last 2 minutes. Spent almost 1 hour debugging it and found there was an overflow error in my $$$nC2$$$ and $$$nC3$$$ functions. I got huge rush when I saw AC on it!! Wonderful questions!!

https://atcoder.jp/contests/abc162/submissions/11854513

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

How to solve E and F? In E I had an idea to check all possible gcds and find answer, in F I have a dp approach but it works in O(n^2).

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

Solutions : D : Iterate on the L,R boundaries of the sequence, maintaining the count of each character in the boundary and if s[L] != s[R], add number of indices that have characters different from both of them to the answer and subtract 1 from it if(L == R(mod 2) and s[(L+R)]/2 == required character ). Time Complexity : (N^2)

E : Simple implementation of sieve. For each i, say number of sequences of length n is f(i) that has gcd = i, then f(i) = (floor(k/i))^n — (f(2*i) + f(3*i) + f(4*i) .... f(i*(floor(k/i))), calculate it from backwards.Time Complexity : O(KlogK)

F : It is easy to observe that gap between consecutive elements cannot exceed 2 or 3, but to be on safe side, lets make it 10. So we can make a dp[i][j] denoting the maximum answer if the sequence ends at index i(taking it) and (ceil(i+1)/2 — j) is the length of the sequence for this answer.It is easy to calculate it via contribution technique.Say before i we take j (j>i-11), and at j we take state k, then a possible transition is dp[i][ceil(i/2) — (ceil(j/2) -k)+(i-j-1)] = max(dp[i][ceil(i/2) — (ceil(j/2) -k)+(i-j-1)] ,dp[j][k] + arr[i]).Don't forget to initialize a possible starting state for each i, ie, dp[i][i] = arr[i] for all possible i. Time Complexity : (n*fac*fac), where fac is around 3-4 for optimized solutions.

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

my solution for F, don't know what is wrong , for me this should work, could anyone help me in figuring out where i am wrong https://atcoder.jp/contests/abc162/submissions/11855696

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

Instant editorial:

A: Just implement. I scanned in as a string to make it easier B: Implement . Use the modulo operator to check for divisibility, a % b == 0 if a is divisible by b C: Implement, just brute force using a triple nested for loop, using Euclid's algorithm to find gcd(i,gcd(j,k)) in O(n^3 logn) time D: Keep a prefix sum of the number of appearances of 'R' in subarray [1,i] for all 1<=i<=n. Do the same for 'G' and 'B'. Now brute force over all (j,k), and one can easily calculate all triples.

E: Let a[i] be the number of tuples with gcd i. Observe that if a tuple has gcd a multiple of i, then all elements of the tuple must also be multiples of i. Let p(i) = number of multiples of i that are <= k. The number of tuples with gcd i can be simply calculated by p(i)^n — a[i*2] — a[i*3]...

We can calculate each a[i] from i = k to 1 in that order.

Calculating each a[i] takes O(k/i) time. Via the harmonic series upper bound, this means that across all i from 1 to k, this method will take O(klogk) time.

F: This is some nasty case bash. First we should calculate a prefix sum for all odd indexed numbers and even indexed numbers.

If n is a even: then either you take all odd indexed numbers, even indexed numbers, or there is a single gap of two. It is enough to consider these cases and to brute force all possible gaps.

If n is odd, then you either don't take either endpoint, you take both endpoints, or you take one of them.

If you don't take either endpoint then there is only one choice: all the "middle" elements.

If you take exactly one of the endpoints, there will be one gap of two or three. Brute force over all the O(n) possible gaps

If you take both endpoints, then you may have two gaps of two or one gap of three. Brute forcing over the O(n) possible gaps of 3 is fine, but there are O(n^2) possible configurations of two gaps of two. However, suppose our gaps are at location i and j, writing down the expression for the resulting sum f(i,j) will look something like f(i,j) = g(i) + h(j) + c for some constant c, and some functions g and h. The exact details depend on implementation details I won't bore you with. By looping over it in a specific way, you can keep a running max of f(i) for some prefix i as you iterate over j, keeping in mind whatever precise restrictions you have on i and j.

Thus, an O(n) algorithm is achieved.

More details upon request.

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

Problem in Q.D what is the problem with this code in QUESTION D ? I am getting WA in 2 test cases

int n;
   cin>>n;
   string s;
   cin>>s;
   if(n==1)
   {cout<<0<<endl;continue;}
   if(n==2)
    {cout<<0<<endl;continue;}

   int a[3]={0};
   for(int i=0;i<n;i++)
   {
       if(s[i]=='R')
        a[0]++;
       else if(s[i]=='G')
        a[1]++;
       else
        a[2]++;
   }
   ll s1=0;
   s1=a[0]*a[1]*a[2];
   for(int i=0;i<n;i++)
   {
       for(int j=1;j<=min(i,n-i-1);j++)
       {
           if(s[i]!=s[i-j] && s[i]!=s[i+j] && s[i-j]!=s[i+j])
           {
               s1--;
           }
       }
   }
   cout<<s1<<endl;
»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Problem E, can someone help me find the bug in my logic? for i : 1 -> k

i = 1,

number of array such that there is at least one 1. -> k^n — (k-1)^n for all such arrays, gcd will be 1.

Now our Integer set reduced to {2,3,4...k}

i = 2,

number of array such that there is at least one 2 out of our Integer set {2,3,4...k} -> T = (k-1)^n — (k-2)^n. for all such arrays, gcd can be either 1 or 2. Number of arrays such that gcd is 2 will be where all elements are power of 2, -> C2 = (k/i)^n-(k/i — 1)^n : Gcd contribution = 2 All the other arrays will have gcd 1 and number of such array is = T-C2.

Continue like this . .

i = k

in the last iteration our integer set will {k}. then number of arrays with this is 1 and gcd contribution is k.

Unable to find my mistake. :( Please help!!

ll fans = 0;
for(int i = 1; i <= k; ++i) 
{
    ll cnt = (pwr(k-i+1,n) - pwr(k-i,n) + mod) % mod; 
    ll a = (k/i);
    ll cnt2 = pwr(a,n) - pwr(a-1,n); // i
    ll cnt3 = (cnt-cnt2+mod)%mod; // 1
    ll tans = (i*cnt2 + 1*cnt3) % mod;
    fans = (fans + tans) % mod;
}
  • »
    »
    6 лет назад, скрыть # ^ |
    Rev. 3  
    Проголосовать: нравится 0 Проголосовать: не нравится

    I was thinking in a similar way but look

    consider i=2 case according to your formula count of such subseq which give gcd=2 is (k-1)^n-(k-2)^n.

    consider this subsequence {2,2,...,2,3} all 2's except the last one being 3 , this will be counted under (k-1)^n and this subseq won't be counted under (k-2)^n as it won't consider 2 as it's element now is the gcd of {2,2,...,2,3} equal to 2? no right it's 1 so you are counting some extra subseq whose gcd isn't i.

    read my previous comment.

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

      For i=2 case, the total number of arrays possible are T = (k-1)^n -(k-2)^n, out of which some arrays will have gcd 1 and some 2. Your example will be counted in case where gcd is 1 for i=2. Out of T arrays, gcd will be 2 if we have an array with multiples of 2. (2,2,...3) will fall in case where all are not multiple of 2 hence gcd 1.

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

        Sorry I haven't fully read your comment. In your statement u have written that numbe r of subseq whose GCD is 2 is (k/i)^n -(k/i-1)^n its wrong I have done same mistake.think about it write a brute force code to check it and you will know the reason.

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

I have a solution for D using prefix array which may take less than O(n^2) time(I cannot figure out what exactly the time complexity is because I am a beginner now ..) If there is any problem, please let me know, thanks!! Your text to link here...

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

For problem F.....

Why is this solution wrong ? I considered that if the number of terms is even, answer is just sum of odd numbered terms or even numbered terms but if the number of terms is odd, we have to skip one extra element i.e. we need to skip two consecutive elements once. Here, dp[i][0] stores if we haven't performed a move where we have skipped two consecutive terms, dp[i][1] stores if we have performed a move where we have skipped two adjacent terms.

    ll dp[n+1][2];mem(dp,0);
    for(int i=1;i<n+1;i++)dp[i][0]=dp[i][1]=-INF;
    dp[1][0]=a[1];dp[1][1]=0;
    dp[2][0]=a[2];dp[2][1]=0;
    for(int i=3;i<n+1;i++)
    {
        dp[i][0]=max(dp[i-2][0]+a[i],dp[i][0]);
        dp[i][1]=max(dp[i-3][0]+a[i],max(dp[i-2][1]+a[i],dp[i][1]));
    }
    if(i&1)
    cout<<max(dp[n][1],dp[n][0]);
    else cout<<max(dp[n-1][0],dp[n][0]);

Please help gazelle camypaper tempura0224 chokudai

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

test cases for f were too weak

7 1 1 1 1 1 1 1 my program was giving output 4 instead of 3 and yet it got accepted

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

Supplementary editorial and sample codes for last 4 problems. More notes "Number Theory for Programming" for problem 5, based on Nisiyama Suzune's blogs and with some extensions.

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

Can Anyone Explain Problem F? In Very Easy Explanation. Like How We Got To This Solution. What is the approach? It Would Be Really Appreciated IF You......

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

Please anyone can explain problem E solution through Euler totient function.