Submission #169833

# Submission time Handle Problem Language Result Execution time Memory
169833 2019-12-23T00:11:17 Z arthur_nascimento Rectangles (IOI19_rect) C++14
50 / 100
5000 ms 778592 KB
    #include "rect.h"
    #include <bits/stdc++.h>
    using namespace std;
    #define pb push_back
    #define debug 
    #define ll long long
    #define maxn 2525
     
     
    int lg[maxn];
     
    struct rmq {
    	
    	int len;
    	int arr[maxn];
    	int id[13][maxn];
    	int mx(int i,int j){
		return arr[id[i][j]];
		}
    	
    	
    	void build(){
		lg[1] = 0;
		for(int i=2;i<=len;i++)
			lg[i] = lg[i-1] + (i == (i&-i));
	
		for(int i=0;i<len;i++){
		//	mx[0][i] = arr[i];
			id[0][i] = i;
		}
		for(int i=1;i<13;i++)
			for(int j=0;j<len;j++){
				int ot = min(len-1, j + ( 1 << (i-1)));
				int A = mx(i-1,j) , B = mx(i-1,ot);
				if(A > B){
					//mx[i][j] = A;
					id[i][j] = id[i-1][j];
				}
				else {
					//mx[i][j] = B;
					id[i][j] = id[i-1][ot];
				}
			}
	}
	
	int pos(int x,int y){
		int l = lg[y-x+1];
		int A = mx(l,x), B = mx(l,y-(1<<l)+1);
		if(A > B) return id[l][x];
		else return id[l][y-(1<<l)+1];
	}
	int val(int x,int y){
		int l = lg[y-x+1];
		int A = mx(l,x), B = mx(l,y-(1<<l)+1);
		return max(A,B);
	}
     
    }
     
    RMQ[2][maxn];
     
     
    int M[maxn][maxn];
     
    int n,m;
     
    int line(int i,int yi,int yf){
    	int r = 1;
    	for(int j=yi;j<=yf;j++)
    		if(M[i][j] >= M[i][yi-1] || M[i][j] >= M[i][yf+1]) r = 0;
    	return r;
    }
     
    int column(int j,int xi,int xf){
    	int r = 1;
    	for(int i=xi;i<=xf;i++)
    		if(M[i][j] >= M[xi-1][j] || M[i][j] >= M[xf+1][j]) r = 0;
    	return r;
    }
     
    int check(int xi,int xf,int yi,int yf){
     
    	for(int i=xi;i<=xf;i++)
    		if( RMQ[0][i].val(yi,yf) >= min( M[i][yi-1],M[i][yf+1])) return 0;
    		
    	//for(int j=yi;j<=yf;j++)
    	//	if( RMQ[1][j].val(xi,xf) >= min( M[xi-1][j],M[xf+1][j])) return 0;
    		
    	return 1;
     
    	//return 1;
    	int r = 1;
    	assert(xi >= 1 && xf <= n-2 && yi >= 1 && yf <= m-2);
    	//for(int i=xi;i<=xf;i++)
    	//	r *= line(i,yi,yf);
    	for(int j=yi;j<=yf;j++)
    		r *= column(j,xi,xf);
    	if(r)
    		debug("achou x:%d~%d y: %d~%d\n",xi,xf,yi,yf);
    	return r;
    } 
     
    ll go4(int xi,int xf,int yi,int yf,int ym){
     
    	if(xi > xf || yi > yf) return 0;
    	if(yi > ym || yf < ym) return 0;
    	debug("oi4\n");
    	ll ans = check(xi,xf,yi,yf);
    	
    	int mx = -1, id = -1;
    	
    	/*for(int i=yi;i<=yf;i++)
    		if(M[xi][i] > mx){
    			mx = M[xi][i];
    			id = i;
    		}*/
    		
    	id = RMQ[0][xi].pos(yi,yf);
    		
    	ans += go4(xi,xf,yi,id-1,ym) + go4(xi,xf,id+1,yf,ym);
    	debug("tchau 4\n");
    	return ans;
     
    }
     
    ll go3(int xi,int xf,int yi,int yf,int ym){
     
    	if(xi == 0 || xf == n-1) return 0;
    	if(xi > xf) return 0;
    	
    	int A = ym, B = ym;
    	
    	debug("oi x: %d~%d y: %d~%d quebra A ? B ?\n",xi,xf,yi,yf);
     
    	if(RMQ[1][ym].val(xi,xf) >= min(M[xi-1][ym],M[xf+1][ym])) return 0;
    	
    	while(1){
    		A--;
    		if(A == 0 || A < yi) break;
    		debug("A %d\n",A);
    		int ok = 1;
    		//for(int i=xi;i<=xf;i++)
    		//	if(M[i][A] >= M[xi-1][A] || M[i][A] >= M[xf+1][A]) ok = 0;
    		if(RMQ[1][A].val(xi,xf) >= min(M[xi-1][A],M[xf+1][A])) ok = 0;
    		if(ok == 0) break;
    	}
    	A++;
    	
    	while(1){
    		B++;
    		if(B == m-1 || B > yf) break;
    		int ok = 1;
    		for(int i=xi;i<=xf;i++)
    			if(M[i][B] >= M[xi-1][B] || M[i][B] >= M[xf+1][B]) ok = 0;
    		if(ok == 0) break;
    	}
    	B--;
    	
    	debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
    	
    	return go4(xi,xf,A,B,ym);
     
    }
     
    ll go2(int xi,int xf,int yi,int yf,int ym){
    	
    	if(xi > xf) return 0;
    	if(yi > yf) return 0;
    	if(ym == 0 || ym == m-1) return 0;
    	debug("go2 x %d~%d y %d~%d\n",xi,xf,yi,yf);
    	
    	int mx = -1, id = -1;
    	
    	/*for(int i=xi;i<=xf;i++)
    		if(M[i][ym] > mx){
    			mx = M[i][ym];
    			id = i;
    		}*/
    	
    	
    	id = RMQ[1][ym].pos(xi,xf);
    	
    		
    	ll ans = go3(xi,id-1,yi,yf,ym) + go3(id+1,xf,yi,yf,ym) + go2(xi,id-1,yi,yf,ym) + go2(id+1,xf,yi,yf,ym);
    	
    	return ans;
     
    }
     
    ll go(int yi,int yf){
     
    	if(yi > yf) return 0;
    	
    	int ym = (yi+yf)/2;
    	debug("oi\n");
    	
    	ll ans = go(yi,ym-1) + go(ym+1,yf) + go2(0,n-1,yi,yf,ym);
    	
    	return ans;
     
    }
     
    long long count_rectangles(std::vector<std::vector<int> > a) {
    	
    	 n = a.size();
    	 m = a[0].size();
    	
    	for(int i=0;i<n;i++)
    		for(int j=0;j<m;j++)
    			M[i][j] = a[i][j];
    			
    	for(int i=0;i<n;i++){
    		
    		RMQ[0][i].len = m;
    		
    		for(int j=0;j<m;j++)
    			RMQ[0][i].arr[j] = M[i][j];
    			
    		RMQ[0][i].build();
    	
    	}	
    	
    	for(int j=0;j<m;j++){
    	
    		RMQ[1][j].len = n;
    		for(int i=0;i<n;i++)
    			RMQ[1][j].arr[i] = M[i][j];
    			
    		RMQ[1][j].build();
    	
    	}	
    	
    	return go(0,m-1);
    	
    }

Compilation message

rect.cpp: In function 'int check(int, int, int, int)':
rect.cpp:99:40: warning: left operand of comma operator has no effect [-Wunused-value]
       debug("achou x:%d~%d y: %d~%d\n",xi,xf,yi,yf);
                                        ^~
rect.cpp:99:43: warning: right operand of comma operator has no effect [-Wunused-value]
       debug("achou x:%d~%d y: %d~%d\n",xi,xf,yi,yf);
                                           ^~
rect.cpp:99:46: warning: right operand of comma operator has no effect [-Wunused-value]
       debug("achou x:%d~%d y: %d~%d\n",xi,xf,yi,yf);
                                              ^~
rect.cpp:99:49: warning: right operand of comma operator has no effect [-Wunused-value]
       debug("achou x:%d~%d y: %d~%d\n",xi,xf,yi,yf);
                                                 ^~
rect.cpp: In function 'long long int go4(int, int, int, int, int)':
rect.cpp:107:20: warning: statement has no effect [-Wunused-value]
      debug("oi4\n");
                    ^
rect.cpp:121:24: warning: statement has no effect [-Wunused-value]
      debug("tchau 4\n");
                        ^
rect.cpp:110:10: warning: unused variable 'mx' [-Wunused-variable]
      int mx = -1, id = -1;
          ^~
rect.cpp: In function 'long long int go3(int, int, int, int, int)':
rect.cpp:133:52: warning: left operand of comma operator has no effect [-Wunused-value]
      debug("oi x: %d~%d y: %d~%d quebra A ? B ?\n",xi,xf,yi,yf);
                                                    ^~
rect.cpp:133:55: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("oi x: %d~%d y: %d~%d quebra A ? B ?\n",xi,xf,yi,yf);
                                                       ^~
rect.cpp:133:58: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("oi x: %d~%d y: %d~%d quebra A ? B ?\n",xi,xf,yi,yf);
                                                          ^~
rect.cpp:133:61: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("oi x: %d~%d y: %d~%d quebra A ? B ?\n",xi,xf,yi,yf);
                                                             ^~
rect.cpp:140:22: warning: left operand of comma operator has no effect [-Wunused-value]
       debug("A %d\n",A);
                      ^
rect.cpp:159:55: warning: left operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                       ^~
rect.cpp:159:58: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                          ^~
rect.cpp:159:61: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                             ^~
rect.cpp:159:64: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                                ^~
rect.cpp:159:67: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                                   ^
rect.cpp:159:69: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go3 x: %d~%d y: %d~%d quebra A %d B %d\n",xi,xf,yi,yf,A,B);
                                                                     ^
rect.cpp: In function 'long long int go2(int, int, int, int, int)':
rect.cpp:170:36: warning: left operand of comma operator has no effect [-Wunused-value]
      debug("go2 x %d~%d y %d~%d\n",xi,xf,yi,yf);
                                    ^~
rect.cpp:170:39: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go2 x %d~%d y %d~%d\n",xi,xf,yi,yf);
                                       ^~
rect.cpp:170:42: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go2 x %d~%d y %d~%d\n",xi,xf,yi,yf);
                                          ^~
rect.cpp:170:45: warning: right operand of comma operator has no effect [-Wunused-value]
      debug("go2 x %d~%d y %d~%d\n",xi,xf,yi,yf);
                                             ^~
rect.cpp:172:10: warning: unused variable 'mx' [-Wunused-variable]
      int mx = -1, id = -1;
          ^~
rect.cpp: In function 'long long int go(int, int)':
rect.cpp:195:19: warning: statement has no effect [-Wunused-value]
      debug("oi\n");
                   ^
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 5 ms 3960 KB Output is correct
3 Correct 5 ms 3964 KB Output is correct
4 Correct 5 ms 3960 KB Output is correct
5 Correct 5 ms 3960 KB Output is correct
6 Correct 5 ms 3960 KB Output is correct
7 Correct 4 ms 2940 KB Output is correct
8 Correct 4 ms 2808 KB Output is correct
9 Correct 5 ms 3964 KB Output is correct
10 Correct 5 ms 3960 KB Output is correct
11 Correct 5 ms 3960 KB Output is correct
12 Correct 5 ms 3960 KB Output is correct
13 Correct 2 ms 476 KB Output is correct
14 Correct 2 ms 1016 KB Output is correct
15 Correct 3 ms 1528 KB Output is correct
16 Correct 2 ms 620 KB Output is correct
17 Correct 2 ms 504 KB Output is correct
18 Correct 2 ms 632 KB Output is correct
19 Correct 5 ms 3988 KB Output is correct
20 Correct 4 ms 3064 KB Output is correct
21 Correct 3 ms 1016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 5 ms 3960 KB Output is correct
3 Correct 5 ms 3964 KB Output is correct
4 Correct 5 ms 3960 KB Output is correct
5 Correct 5 ms 3960 KB Output is correct
6 Correct 5 ms 3960 KB Output is correct
7 Correct 4 ms 2940 KB Output is correct
8 Correct 4 ms 2808 KB Output is correct
9 Correct 5 ms 3964 KB Output is correct
10 Correct 5 ms 3960 KB Output is correct
11 Correct 5 ms 3960 KB Output is correct
12 Correct 5 ms 3960 KB Output is correct
13 Correct 2 ms 476 KB Output is correct
14 Correct 2 ms 1016 KB Output is correct
15 Correct 3 ms 1528 KB Output is correct
16 Correct 2 ms 620 KB Output is correct
17 Correct 13 ms 10488 KB Output is correct
18 Correct 13 ms 10488 KB Output is correct
19 Correct 13 ms 10488 KB Output is correct
20 Correct 10 ms 10488 KB Output is correct
21 Correct 11 ms 10360 KB Output is correct
22 Correct 11 ms 10488 KB Output is correct
23 Correct 11 ms 10492 KB Output is correct
24 Correct 8 ms 7928 KB Output is correct
25 Correct 2 ms 504 KB Output is correct
26 Correct 2 ms 632 KB Output is correct
27 Correct 5 ms 3988 KB Output is correct
28 Correct 4 ms 3064 KB Output is correct
29 Correct 3 ms 1016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 5 ms 3960 KB Output is correct
3 Correct 5 ms 3964 KB Output is correct
4 Correct 5 ms 3960 KB Output is correct
5 Correct 5 ms 3960 KB Output is correct
6 Correct 5 ms 3960 KB Output is correct
7 Correct 4 ms 2940 KB Output is correct
8 Correct 4 ms 2808 KB Output is correct
9 Correct 5 ms 3964 KB Output is correct
10 Correct 5 ms 3960 KB Output is correct
11 Correct 5 ms 3960 KB Output is correct
12 Correct 5 ms 3960 KB Output is correct
13 Correct 2 ms 476 KB Output is correct
14 Correct 2 ms 1016 KB Output is correct
15 Correct 3 ms 1528 KB Output is correct
16 Correct 2 ms 620 KB Output is correct
17 Correct 13 ms 10488 KB Output is correct
18 Correct 13 ms 10488 KB Output is correct
19 Correct 13 ms 10488 KB Output is correct
20 Correct 10 ms 10488 KB Output is correct
21 Correct 11 ms 10360 KB Output is correct
22 Correct 11 ms 10488 KB Output is correct
23 Correct 11 ms 10492 KB Output is correct
24 Correct 8 ms 7928 KB Output is correct
25 Correct 80 ms 28664 KB Output is correct
26 Correct 81 ms 28740 KB Output is correct
27 Correct 80 ms 28856 KB Output is correct
28 Correct 30 ms 28540 KB Output is correct
29 Correct 33 ms 28624 KB Output is correct
30 Correct 34 ms 28792 KB Output is correct
31 Correct 34 ms 28792 KB Output is correct
32 Correct 34 ms 28536 KB Output is correct
33 Correct 2 ms 504 KB Output is correct
34 Correct 2 ms 632 KB Output is correct
35 Correct 5 ms 3988 KB Output is correct
36 Correct 4 ms 3064 KB Output is correct
37 Correct 3 ms 1016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 5 ms 3960 KB Output is correct
3 Correct 5 ms 3964 KB Output is correct
4 Correct 5 ms 3960 KB Output is correct
5 Correct 5 ms 3960 KB Output is correct
6 Correct 5 ms 3960 KB Output is correct
7 Correct 4 ms 2940 KB Output is correct
8 Correct 4 ms 2808 KB Output is correct
9 Correct 5 ms 3964 KB Output is correct
10 Correct 5 ms 3960 KB Output is correct
11 Correct 5 ms 3960 KB Output is correct
12 Correct 5 ms 3960 KB Output is correct
13 Correct 2 ms 476 KB Output is correct
14 Correct 2 ms 1016 KB Output is correct
15 Correct 3 ms 1528 KB Output is correct
16 Correct 2 ms 620 KB Output is correct
17 Correct 13 ms 10488 KB Output is correct
18 Correct 13 ms 10488 KB Output is correct
19 Correct 13 ms 10488 KB Output is correct
20 Correct 10 ms 10488 KB Output is correct
21 Correct 11 ms 10360 KB Output is correct
22 Correct 11 ms 10488 KB Output is correct
23 Correct 11 ms 10492 KB Output is correct
24 Correct 8 ms 7928 KB Output is correct
25 Correct 80 ms 28664 KB Output is correct
26 Correct 81 ms 28740 KB Output is correct
27 Correct 80 ms 28856 KB Output is correct
28 Correct 30 ms 28540 KB Output is correct
29 Correct 33 ms 28624 KB Output is correct
30 Correct 34 ms 28792 KB Output is correct
31 Correct 34 ms 28792 KB Output is correct
32 Correct 34 ms 28536 KB Output is correct
33 Correct 230 ms 142840 KB Output is correct
34 Correct 239 ms 142528 KB Output is correct
35 Correct 209 ms 142584 KB Output is correct
36 Correct 233 ms 142592 KB Output is correct
37 Execution timed out 5048 ms 142456 KB Time limit exceeded
38 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 108 ms 141816 KB Output is correct
2 Correct 92 ms 120568 KB Output is correct
3 Correct 107 ms 141944 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 108 ms 141788 KB Output is correct
6 Correct 108 ms 141796 KB Output is correct
7 Correct 108 ms 141852 KB Output is correct
8 Correct 107 ms 141816 KB Output is correct
9 Correct 107 ms 141816 KB Output is correct
10 Correct 106 ms 141176 KB Output is correct
11 Correct 106 ms 141560 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1528 KB Output is correct
2 Correct 828 ms 496780 KB Output is correct
3 Correct 1637 ms 768760 KB Output is correct
4 Correct 1648 ms 778356 KB Output is correct
5 Correct 1644 ms 778484 KB Output is correct
6 Correct 711 ms 522884 KB Output is correct
7 Correct 1276 ms 753144 KB Output is correct
8 Correct 1381 ms 778592 KB Output is correct
9 Correct 2 ms 504 KB Output is correct
10 Correct 2 ms 632 KB Output is correct
11 Correct 5 ms 3988 KB Output is correct
12 Correct 4 ms 3064 KB Output is correct
13 Correct 3 ms 1016 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 1016 KB Output is correct
2 Correct 5 ms 3960 KB Output is correct
3 Correct 5 ms 3964 KB Output is correct
4 Correct 5 ms 3960 KB Output is correct
5 Correct 5 ms 3960 KB Output is correct
6 Correct 5 ms 3960 KB Output is correct
7 Correct 4 ms 2940 KB Output is correct
8 Correct 4 ms 2808 KB Output is correct
9 Correct 5 ms 3964 KB Output is correct
10 Correct 5 ms 3960 KB Output is correct
11 Correct 5 ms 3960 KB Output is correct
12 Correct 5 ms 3960 KB Output is correct
13 Correct 2 ms 476 KB Output is correct
14 Correct 2 ms 1016 KB Output is correct
15 Correct 3 ms 1528 KB Output is correct
16 Correct 2 ms 620 KB Output is correct
17 Correct 13 ms 10488 KB Output is correct
18 Correct 13 ms 10488 KB Output is correct
19 Correct 13 ms 10488 KB Output is correct
20 Correct 10 ms 10488 KB Output is correct
21 Correct 11 ms 10360 KB Output is correct
22 Correct 11 ms 10488 KB Output is correct
23 Correct 11 ms 10492 KB Output is correct
24 Correct 8 ms 7928 KB Output is correct
25 Correct 80 ms 28664 KB Output is correct
26 Correct 81 ms 28740 KB Output is correct
27 Correct 80 ms 28856 KB Output is correct
28 Correct 30 ms 28540 KB Output is correct
29 Correct 33 ms 28624 KB Output is correct
30 Correct 34 ms 28792 KB Output is correct
31 Correct 34 ms 28792 KB Output is correct
32 Correct 34 ms 28536 KB Output is correct
33 Correct 230 ms 142840 KB Output is correct
34 Correct 239 ms 142528 KB Output is correct
35 Correct 209 ms 142584 KB Output is correct
36 Correct 233 ms 142592 KB Output is correct
37 Execution timed out 5048 ms 142456 KB Time limit exceeded
38 Halted 0 ms 0 KB -