Submission #154555

# Submission time Handle Problem Language Result Execution time Memory
154555 2019-09-22T17:25:30 Z Dormi Rectangles (IOI19_rect) C++14
100 / 100
4348 ms 781840 KB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int MAXN=2500;
int bit[MAXN+1];
int n,m;
vector<pii> rowranges[MAXN][MAXN];
vector<pii> colranges[MAXN][MAXN];
int preloc[MAXN];
int sufloc[MAXN];
pii deq[MAXN];
inline void update(int loc, int val){
	for(;loc<=n;loc+=loc&-loc)bit[loc]+=val;
}
inline int sum(int loc){
	int ans=0;
	for(;loc>0;loc-=loc&-loc)ans+=bit[loc];
	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++){
		int l=0,r=-1;
		for(int j=m-1;j>=0;j--){
			while(r>=l&&deq[r].second<=a[i][j])r--;
			if(r>=l)sufloc[j]=deq[r].first;
			else sufloc[j]=-1;
			deq[++r]={j,a[i][j]};
		}
		l=0,r=-1;
		for(int j=0;j<m;j++){
			while(r>=l&&deq[r].second<=a[i][j])r--;
			if(r>=l)preloc[j]=deq[r].first;
			else preloc[j]=-1;
			deq[++r]={j,a[i][j]};
			if(preloc[j]!=-1&&sufloc[j]!=-1){
				while(rowranges[i][preloc[j]+1].size()&&rowranges[i][preloc[j]+1].back().first==sufloc[j]-1)rowranges[i][preloc[j]+1].pop_back();
				rowranges[i][preloc[j]+1].emplace_back(sufloc[j]-1,1);
			}
		}
	}
	for(int i=0;i<m;i++){
		int l=0,r=-1;
		for(int j=n-1;j>=0;j--){
			while(r>=l&&deq[r].second<=a[j][i])r--;
			if(r>=l)sufloc[j]=deq[r].first;
			else sufloc[j]=-1;
			deq[++r]={j,a[j][i]};
		}
		l=0,r=-1;
		for(int j=0;j<n;j++){
			while(r>=l&&deq[r].second<=a[j][i])r--;
			if(r>=l)preloc[j]=deq[r].first;
			else preloc[j]=-1;
			deq[++r]={j,a[j][i]};
			if(preloc[j]!=-1&&sufloc[j]!=-1){
				while(colranges[preloc[j]+1][i].size()&&colranges[preloc[j]+1][i].back().first==sufloc[j]-1)colranges[preloc[j]+1][i].pop_back();
				colranges[preloc[j]+1][i].emplace_back(sufloc[j]-1,1);
			}
		}
	}
	for(int i=0;i<m;i++){
		for(int j=n-2;j>=0;j--){
			int l=0,r=0;
			while(l<rowranges[j][i].size()&&r<rowranges[j+1][i].size()){
				if(rowranges[j][i][l].first==rowranges[j+1][i][r].first){
					rowranges[j][i][l].second+=rowranges[j+1][i][r].second;
					l++;
				}
				else if(rowranges[j][i][l].first>rowranges[j+1][i][r].first){
					r++;
				}
				else l++;
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=m-2;j>=0;j--){
			int l=0,r=0;
			while(l<colranges[i][j].size()&&r<colranges[i][j+1].size()){
				if(colranges[i][j][l].first==colranges[i][j+1][r].first){
					colranges[i][j][l].second+=colranges[i][j+1][r].second;
					l++;
				}
				else if(colranges[i][j][l].first>colranges[i][j+1][r].first){
					r++;
				}
				else l++;
			}
		}
	}
	int cnt=0;
	auto f = [&] (const pii& a, const pii& b) {
		return a.second<b.second;
	};
	for(int i=0;i<n;i++)for(int j=0;j<m;j++){
			sort(colranges[i][j].begin(),colranges[i][j].end(),f);
			int r=colranges[i][j].size();
			for(int k=(int)rowranges[i][j].size()-1;k>=0;k--){
				while(r>0&&colranges[i][j][r-1].second+j-1>=rowranges[i][j][k].first){
					r-=1;
					update(colranges[i][j][r].first+1,1);
				}
				cnt+=sum(rowranges[i][j][k].second+i);
			}
			for(int k=r;k<colranges[i][j].size();k++)update(colranges[i][j][k].first+1,-1);
		}
	return cnt;
}

Compilation message

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:66:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(l<rowranges[j][i].size()&&r<rowranges[j+1][i].size()){
          ~^~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:66:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(l<rowranges[j][i].size()&&r<rowranges[j+1][i].size()){
                                    ~^~~~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:81:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(l<colranges[i][j].size()&&r<colranges[i][j+1].size()){
          ~^~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:81:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(l<colranges[i][j].size()&&r<colranges[i][j+1].size()){
                                    ~^~~~~~~~~~~~~~~~~~~~~~~~~
rect.cpp:107:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int k=r;k<colranges[i][j].size();k++)update(colranges[i][j][k].first+1,-1);
                ~^~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 273 ms 293880 KB Output is correct
2 Correct 286 ms 293888 KB Output is correct
3 Correct 303 ms 294008 KB Output is correct
4 Correct 271 ms 294068 KB Output is correct
5 Correct 270 ms 293880 KB Output is correct
6 Correct 271 ms 293884 KB Output is correct
7 Correct 273 ms 293912 KB Output is correct
8 Correct 298 ms 293864 KB Output is correct
9 Correct 270 ms 293880 KB Output is correct
10 Correct 270 ms 294024 KB Output is correct
11 Correct 270 ms 293880 KB Output is correct
12 Correct 272 ms 294008 KB Output is correct
13 Correct 281 ms 294072 KB Output is correct
14 Correct 271 ms 293928 KB Output is correct
15 Correct 272 ms 293880 KB Output is correct
16 Correct 270 ms 293880 KB Output is correct
17 Correct 271 ms 293840 KB Output is correct
18 Correct 274 ms 293880 KB Output is correct
19 Correct 271 ms 293828 KB Output is correct
20 Correct 270 ms 293880 KB Output is correct
21 Correct 271 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 273 ms 293880 KB Output is correct
2 Correct 286 ms 293888 KB Output is correct
3 Correct 303 ms 294008 KB Output is correct
4 Correct 271 ms 294068 KB Output is correct
5 Correct 270 ms 293880 KB Output is correct
6 Correct 271 ms 293884 KB Output is correct
7 Correct 273 ms 293912 KB Output is correct
8 Correct 298 ms 293864 KB Output is correct
9 Correct 270 ms 293880 KB Output is correct
10 Correct 270 ms 294024 KB Output is correct
11 Correct 270 ms 293880 KB Output is correct
12 Correct 272 ms 294008 KB Output is correct
13 Correct 281 ms 294072 KB Output is correct
14 Correct 271 ms 293928 KB Output is correct
15 Correct 272 ms 293880 KB Output is correct
16 Correct 270 ms 293880 KB Output is correct
17 Correct 276 ms 294220 KB Output is correct
18 Correct 292 ms 294428 KB Output is correct
19 Correct 273 ms 294364 KB Output is correct
20 Correct 271 ms 294136 KB Output is correct
21 Correct 273 ms 294136 KB Output is correct
22 Correct 272 ms 294200 KB Output is correct
23 Correct 273 ms 294132 KB Output is correct
24 Correct 273 ms 294008 KB Output is correct
25 Correct 271 ms 293840 KB Output is correct
26 Correct 274 ms 293880 KB Output is correct
27 Correct 271 ms 293828 KB Output is correct
28 Correct 270 ms 293880 KB Output is correct
29 Correct 271 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 273 ms 293880 KB Output is correct
2 Correct 286 ms 293888 KB Output is correct
3 Correct 303 ms 294008 KB Output is correct
4 Correct 271 ms 294068 KB Output is correct
5 Correct 270 ms 293880 KB Output is correct
6 Correct 271 ms 293884 KB Output is correct
7 Correct 273 ms 293912 KB Output is correct
8 Correct 298 ms 293864 KB Output is correct
9 Correct 270 ms 293880 KB Output is correct
10 Correct 270 ms 294024 KB Output is correct
11 Correct 270 ms 293880 KB Output is correct
12 Correct 272 ms 294008 KB Output is correct
13 Correct 281 ms 294072 KB Output is correct
14 Correct 271 ms 293928 KB Output is correct
15 Correct 272 ms 293880 KB Output is correct
16 Correct 270 ms 293880 KB Output is correct
17 Correct 276 ms 294220 KB Output is correct
18 Correct 292 ms 294428 KB Output is correct
19 Correct 273 ms 294364 KB Output is correct
20 Correct 271 ms 294136 KB Output is correct
21 Correct 273 ms 294136 KB Output is correct
22 Correct 272 ms 294200 KB Output is correct
23 Correct 273 ms 294132 KB Output is correct
24 Correct 273 ms 294008 KB Output is correct
25 Correct 282 ms 296668 KB Output is correct
26 Correct 298 ms 296664 KB Output is correct
27 Correct 298 ms 296712 KB Output is correct
28 Correct 281 ms 295124 KB Output is correct
29 Correct 284 ms 295580 KB Output is correct
30 Correct 288 ms 295576 KB Output is correct
31 Correct 287 ms 295592 KB Output is correct
32 Correct 286 ms 295500 KB Output is correct
33 Correct 271 ms 293840 KB Output is correct
34 Correct 274 ms 293880 KB Output is correct
35 Correct 271 ms 293828 KB Output is correct
36 Correct 270 ms 293880 KB Output is correct
37 Correct 271 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 273 ms 293880 KB Output is correct
2 Correct 286 ms 293888 KB Output is correct
3 Correct 303 ms 294008 KB Output is correct
4 Correct 271 ms 294068 KB Output is correct
5 Correct 270 ms 293880 KB Output is correct
6 Correct 271 ms 293884 KB Output is correct
7 Correct 273 ms 293912 KB Output is correct
8 Correct 298 ms 293864 KB Output is correct
9 Correct 270 ms 293880 KB Output is correct
10 Correct 270 ms 294024 KB Output is correct
11 Correct 270 ms 293880 KB Output is correct
12 Correct 272 ms 294008 KB Output is correct
13 Correct 281 ms 294072 KB Output is correct
14 Correct 271 ms 293928 KB Output is correct
15 Correct 272 ms 293880 KB Output is correct
16 Correct 270 ms 293880 KB Output is correct
17 Correct 276 ms 294220 KB Output is correct
18 Correct 292 ms 294428 KB Output is correct
19 Correct 273 ms 294364 KB Output is correct
20 Correct 271 ms 294136 KB Output is correct
21 Correct 273 ms 294136 KB Output is correct
22 Correct 272 ms 294200 KB Output is correct
23 Correct 273 ms 294132 KB Output is correct
24 Correct 273 ms 294008 KB Output is correct
25 Correct 282 ms 296668 KB Output is correct
26 Correct 298 ms 296664 KB Output is correct
27 Correct 298 ms 296712 KB Output is correct
28 Correct 281 ms 295124 KB Output is correct
29 Correct 284 ms 295580 KB Output is correct
30 Correct 288 ms 295576 KB Output is correct
31 Correct 287 ms 295592 KB Output is correct
32 Correct 286 ms 295500 KB Output is correct
33 Correct 375 ms 313096 KB Output is correct
34 Correct 397 ms 308440 KB Output is correct
35 Correct 338 ms 308344 KB Output is correct
36 Correct 326 ms 303568 KB Output is correct
37 Correct 517 ms 328568 KB Output is correct
38 Correct 462 ms 328200 KB Output is correct
39 Correct 462 ms 328360 KB Output is correct
40 Correct 438 ms 326128 KB Output is correct
41 Correct 389 ms 305484 KB Output is correct
42 Correct 388 ms 307960 KB Output is correct
43 Correct 459 ms 315820 KB Output is correct
44 Correct 486 ms 316072 KB Output is correct
45 Correct 369 ms 304876 KB Output is correct
46 Correct 364 ms 304892 KB Output is correct
47 Correct 453 ms 314516 KB Output is correct
48 Correct 458 ms 316792 KB Output is correct
49 Correct 271 ms 293840 KB Output is correct
50 Correct 274 ms 293880 KB Output is correct
51 Correct 271 ms 293828 KB Output is correct
52 Correct 270 ms 293880 KB Output is correct
53 Correct 271 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 272 ms 294324 KB Output is correct
2 Correct 283 ms 294276 KB Output is correct
3 Correct 271 ms 294064 KB Output is correct
4 Correct 268 ms 293916 KB Output is correct
5 Correct 273 ms 294136 KB Output is correct
6 Correct 272 ms 294136 KB Output is correct
7 Correct 273 ms 294180 KB Output is correct
8 Correct 296 ms 294232 KB Output is correct
9 Correct 273 ms 294236 KB Output is correct
10 Correct 272 ms 293936 KB Output is correct
11 Correct 269 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 270 ms 293832 KB Output is correct
2 Correct 854 ms 361516 KB Output is correct
3 Correct 1747 ms 440340 KB Output is correct
4 Correct 1681 ms 440956 KB Output is correct
5 Correct 1695 ms 441184 KB Output is correct
6 Correct 423 ms 318588 KB Output is correct
7 Correct 626 ms 340344 KB Output is correct
8 Correct 647 ms 343276 KB Output is correct
9 Correct 271 ms 293840 KB Output is correct
10 Correct 274 ms 293880 KB Output is correct
11 Correct 271 ms 293828 KB Output is correct
12 Correct 270 ms 293880 KB Output is correct
13 Correct 271 ms 293880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 273 ms 293880 KB Output is correct
2 Correct 286 ms 293888 KB Output is correct
3 Correct 303 ms 294008 KB Output is correct
4 Correct 271 ms 294068 KB Output is correct
5 Correct 270 ms 293880 KB Output is correct
6 Correct 271 ms 293884 KB Output is correct
7 Correct 273 ms 293912 KB Output is correct
8 Correct 298 ms 293864 KB Output is correct
9 Correct 270 ms 293880 KB Output is correct
10 Correct 270 ms 294024 KB Output is correct
11 Correct 270 ms 293880 KB Output is correct
12 Correct 272 ms 294008 KB Output is correct
13 Correct 281 ms 294072 KB Output is correct
14 Correct 271 ms 293928 KB Output is correct
15 Correct 272 ms 293880 KB Output is correct
16 Correct 270 ms 293880 KB Output is correct
17 Correct 276 ms 294220 KB Output is correct
18 Correct 292 ms 294428 KB Output is correct
19 Correct 273 ms 294364 KB Output is correct
20 Correct 271 ms 294136 KB Output is correct
21 Correct 273 ms 294136 KB Output is correct
22 Correct 272 ms 294200 KB Output is correct
23 Correct 273 ms 294132 KB Output is correct
24 Correct 273 ms 294008 KB Output is correct
25 Correct 282 ms 296668 KB Output is correct
26 Correct 298 ms 296664 KB Output is correct
27 Correct 298 ms 296712 KB Output is correct
28 Correct 281 ms 295124 KB Output is correct
29 Correct 284 ms 295580 KB Output is correct
30 Correct 288 ms 295576 KB Output is correct
31 Correct 287 ms 295592 KB Output is correct
32 Correct 286 ms 295500 KB Output is correct
33 Correct 375 ms 313096 KB Output is correct
34 Correct 397 ms 308440 KB Output is correct
35 Correct 338 ms 308344 KB Output is correct
36 Correct 326 ms 303568 KB Output is correct
37 Correct 517 ms 328568 KB Output is correct
38 Correct 462 ms 328200 KB Output is correct
39 Correct 462 ms 328360 KB Output is correct
40 Correct 438 ms 326128 KB Output is correct
41 Correct 389 ms 305484 KB Output is correct
42 Correct 388 ms 307960 KB Output is correct
43 Correct 459 ms 315820 KB Output is correct
44 Correct 486 ms 316072 KB Output is correct
45 Correct 369 ms 304876 KB Output is correct
46 Correct 364 ms 304892 KB Output is correct
47 Correct 453 ms 314516 KB Output is correct
48 Correct 458 ms 316792 KB Output is correct
49 Correct 272 ms 294324 KB Output is correct
50 Correct 283 ms 294276 KB Output is correct
51 Correct 271 ms 294064 KB Output is correct
52 Correct 268 ms 293916 KB Output is correct
53 Correct 273 ms 294136 KB Output is correct
54 Correct 272 ms 294136 KB Output is correct
55 Correct 273 ms 294180 KB Output is correct
56 Correct 296 ms 294232 KB Output is correct
57 Correct 273 ms 294236 KB Output is correct
58 Correct 272 ms 293936 KB Output is correct
59 Correct 269 ms 293880 KB Output is correct
60 Correct 270 ms 293832 KB Output is correct
61 Correct 854 ms 361516 KB Output is correct
62 Correct 1747 ms 440340 KB Output is correct
63 Correct 1681 ms 440956 KB Output is correct
64 Correct 1695 ms 441184 KB Output is correct
65 Correct 423 ms 318588 KB Output is correct
66 Correct 626 ms 340344 KB Output is correct
67 Correct 647 ms 343276 KB Output is correct
68 Correct 1877 ms 539300 KB Output is correct
69 Correct 1833 ms 472548 KB Output is correct
70 Correct 1284 ms 472556 KB Output is correct
71 Correct 1050 ms 405360 KB Output is correct
72 Correct 4196 ms 757500 KB Output is correct
73 Correct 1949 ms 462120 KB Output is correct
74 Correct 2089 ms 472360 KB Output is correct
75 Correct 3169 ms 574384 KB Output is correct
76 Correct 2055 ms 491896 KB Output is correct
77 Correct 2664 ms 557916 KB Output is correct
78 Correct 3318 ms 624004 KB Output is correct
79 Correct 1942 ms 473876 KB Output is correct
80 Correct 3239 ms 607776 KB Output is correct
81 Correct 3074 ms 598420 KB Output is correct
82 Correct 2627 ms 586580 KB Output is correct
83 Correct 4348 ms 781468 KB Output is correct
84 Correct 4285 ms 781780 KB Output is correct
85 Correct 4264 ms 781840 KB Output is correct
86 Correct 271 ms 293840 KB Output is correct
87 Correct 274 ms 293880 KB Output is correct
88 Correct 271 ms 293828 KB Output is correct
89 Correct 270 ms 293880 KB Output is correct
90 Correct 271 ms 293880 KB Output is correct