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

Автор awoo, история, 7 лет назад, По-русски

1303A - Erasing Zeroes

Идея: Roms

Разбор
Решение (Roms)

1303B - National Project

Идея: adedalic

Разбор
Решение (adedalic)

1303C - Perfect Keyboard

Идея: Roms

Разбор
Решение (Ne0n25)

1303D - Fill The Bag

Идея: Roms

Разбор
Решение (Roms)

1303E - Erase Subsequences

Идея: adedalic

Разбор
Решение (adedalic)

1303F - Number of Components

Идея: Neon

Разбор
Решение (Ne0n25)

1303G - Sum of Prefix Sums

Идея: Neon

Разбор
Решение (BledDest)
  • Проголосовать: нравится
  • +89
  • Проголосовать: не нравится

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

Why this post doesn't have any comments?

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

can someone please explain a little bit about the proof of algorithm of problem F? Why considering all the delete queries in the last doesn't affect the final results?

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

    because the delete queries are after the add queries.

    when considering color $$$t$$$,all the add queries is the queries with $$$c_i=t$$$ ,then for sure,they are consquent,and so for sure all the delete queries are after the add queries

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

      But this is true for a particular color right? Like for a color c what ideally should have been done is to perform add query and then immediately after that perform it's delete queries but in code above they are doing all add first and then all delete query.

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

        No...for a certain color c and all the queries with ci=c,the queries are consquent,so they changed some of the cells into color c.There isn't any delete query between them.After that,some queries may change the color of some cells which were color c,these are the delete queries.

        Like this example:

        2 2 4
        1 1 1
        1 2 1
        2 1 2
        1 1 2
        

        For color 1,the add queries are the 1st and the 2nd while the delete query is the 4th.

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

          Sorry but I think I didn't convey my doubt properly. I am talking about this part of code ..

          forn(i, clrs) recalc(add[i], +1);
          forn(i, clrs) recalc(del[i], -1);
          

          Here we are processing all the delete queries at the end (even after the add queries of same cell i.e. even after add query of (x, y) from c1 to c2).

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

In problem D

If in binary representation of n the i-th bit is equal to 1 and we have at most one box of size 2^i,

I think this should be at least?

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

can someone please explain me about problem B why TotalG = ceil(needG / g) * (g + b) , i don't understand that clearly =)) ????

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

    every (g + b) days have exactly (g) days good, we call it a block. So if we need (needG) days good, we must have ceil(needG / g) blocks, thus TotalG = ceil(needG / g) * (g + b).

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

What is the time complexity for G? nlgnlgn?

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

Has anyone used adjacency list to solve C ? If so could you share your idea/implementation thanks

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

    Here is my submission — 70873445
    Just store the letter as an undirected graph and make sure that every vertex has degree 1 or 2.
    Then loop through all the vertex and find the vertex which has degree 1 because that would be the start/end of the graph.

    Now go for dfs, if you find a cycle in the graph, that means it's not possible, otherwise dfs will give you the starting letters of the keyboard.

    Then just add the remaining alphabets back in the string.

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

The problem statement of F says $$$1 \le c_i \le max(1000,\lceil \frac{2⋅10^6}{nm} \rceil)$$$.

Should not that be $$$min$$$ instead of $$$max$$$?

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

Can someone help me understand why my code for G is TLE on test 33? I've read the editorial and I think I am doing the same thing.

https://codeforces.me/contest/1303/submission/71252477

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

    I had also struggled from test 33, and finally made it accepted.

    I don't know what exactly is test 33, but this test generator code would be helpful. It takes about 20 sec on N=150000 on your code.

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <random>
    #include <ctime>
    #include <queue>
    #include <cmath>
    
    using namespace std;
    
    inline int randint(int a, int b) {
    	return rand()%(b-a+1) + a;
    }
    
    int main() {
    	int n;
    	//cin >> n;
    	n = 150000;
    	
    	cout << n << endl;
    	
    	srand(time(0));
    
    	vector<int> perm(n+1, 0);
    	for (int i=1; i<=n; i++) perm[i] = i;
    	for (int it=n*10; it--; ) {
    		int a = randint(1, n);
    		int b = randint(1, n);
    		swap(perm[a], perm[b]);
    	}
    
    	// sqrt tree, binary tree
    	int sq = sqrt(n);
    	// int sq = 2; // binary
    	queue<int> qu;
    	qu.push(1);
    	int p = 2;
    	while (p <= n) {
    		int a = qu.front(); qu.pop();
    		for (int i=0; i<sq; i++) {
    			cout << perm[a] << ' ' << perm[p++] << endl;
    			if (p == n+1) break;
    			qu.push(p-1);
    		}
    	}
    	/* */
    	
    	for (int i=1; i<=n; i++) {
    		cout << randint(1, 1000000) << ' ';
    	}
    	cout << endl;
    }
    
    

    Use the output of the generator code as the input.

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

can someone explain the solution for problem b

i think it gives right answer for 5 1 5 but wrong for 10 1 10

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

Typo in D, case 2, "most" should be "least".

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

How to proof that D solution is optimal(finds min number of divides)?

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

Hi awoo! Why the scheduled codeforces educational round 83 was deleted?

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

For problem G, how can we get all the "first parts" and "second parts" efficiently?

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

I think there is a mistake in the tests in the B problem. MY solution as well as the tutorial both fail at the same place in the second test. Here is my code: (https://codeforces.me/problemset/submission/1303/79669445)(https://codeforces.me/problemset/submission/1303/79668860). Could someone tell me if there is a mistake

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

    When you calculate minN = round(n / 2), n is truncated before round is called because it's an integer. So n always rounds down instead of rounding up. You can fix this by doing minN = (n+1) / 2 instead.

    Also, it's a little arrogant to assume that the tests are wrong if your code doesn't get AC. Especially if nearly 6,000 others have solved without any issues. So test your code a little on some cases first, before assuming the writers messed up.

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

80808954 Which case am i missing? (Problem B)

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

[Deleted]

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

In problem F, can someone please explain the intuition behind deleting cells. How is it similar to adding in reverse order? awoo

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

in D how do we go about the optimality?

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

Alternate dp for E. Let $$$dp[len_{s}][len_{a}]$$$ be the max $$$len_{b}$$$ such that the prefix of $$$s$$$ of length $$$len_{s}$$$ contains non-intersecting subsequences of $$$a$$$ and $$$b$$$ of $$$len_{a}$$$ and $$$len_{b}$$$. Set it to -1 if the prefix does not contain a subsequence of length $$$len_{a}$$$. With this approach we don't have to calculate the array $$$nxt$$$ or make the observation in the editorial. Code 97250299

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

How is solution for D optimal?

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

Erasing Zeroes //my solution

include<stdio.h>

include<string.h>

main(){ int t; scanf("%d",&t); char str[101]; while(t--){ scanf("%s",&str); int poslast1,posfirst1,c=0; int l=strlen(str); for(int i=0;i<l;i++){ if(str[i]=='1') posfirst1=i; break; } for(int j=l-1;j>=0;j--){ if(str[j]=='1') poslast1=j; break; } for(int k=posfirst1;k<=poslast1;k++){ if(str[k]=='0') c++; } printf("%d\n",c); } return 0; }

//what's problem in this

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

In problem G, the value of a path between any two nodes can also be queried using binary lifting. (When you have to compute for upward path, just do it like normal binary lifting. When you have to compute for downward path, "invert" its coinciding upward path using trivial relation between prefix sum and suffix sum)

Implementation