Submission #153560

# Submission time Handle Problem Language Result Execution time Memory
153560 2019-09-14T15:43:21 Z myungwoo Rectangles (IOI19_rect) C++14
72 / 100
5000 ms 499208 KB
#include <bits/stdc++.h>
#include "rect.h"
using namespace std;

#define fr first
#define sc second
#define pb push_back
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
typedef long long lld;
typedef pair<int, int> pii;

int N, M;
int A[2502][2502];
pii ver[2502][2502], hor[2502][2502];

struct SEGMENT {
	int a, b, t, dp;
	bool operator < (const SEGMENT &ot)const{
		if (t != ot.t) return t < ot.t;
		if (a != ot.a) return a < ot.a;
		return b < ot.b;
	}
	bool operator == (const SEGMENT &ot)const{
		return a == ot.a && b == ot.b && t == ot.t;
	}
	bool operator != (const SEGMENT &ot)const{
		return a != ot.a || b != ot.b || t != ot.t;
	}
};

struct RECT {
	int a, b, c, d;
	bool operator < (const RECT &ot)const{
		if (a != ot.a) return a < ot.a;
		if (b != ot.b) return b < ot.b;
		if (c != ot.c) return c < ot.c;
		return d < ot.d;
	}
	bool operator == (const RECT &ot)const{
		return a == ot.a && b == ot.b && c == ot.c && d == ot.d;
	}
};

lld count_rectangles(vector<vector<int> > a)
{
	N = sz(a); M = sz(a[0]);
	for (int i=1;i<=N;i++) for (int j=1;j<=M;j++) A[i][j] = a[i-1][j-1];
	vector <SEGMENT> vertical, horizontal;
	for (int i=1;i<=N;i++){
		{
			stack <int> stk;
			for (int j=1;j<=M;j++){
				while (!stk.empty() && A[i][stk.top()] <= A[i][j]) stk.pop();
				hor[i][j].fr = stk.empty() ? 1 : stk.top()+1;
				stk.push(j);
			}
		}
		{
			stack <int> stk;
			for (int j=M;j;j--){
				while (!stk.empty() && A[i][stk.top()] <= A[i][j]) stk.pop();
				hor[i][j].sc = stk.empty() ? M : stk.top()-1;
				stk.push(j);
			}
		}
	}
	for (int j=1;j<=M;j++){
		{
			stack <int> stk;
			for (int i=1;i<=N;i++){
				while (!stk.empty() && A[stk.top()][j] <= A[i][j]) stk.pop();
				ver[i][j].fr = stk.empty() ? 1 : stk.top()+1;
				stk.push(i);
			}
		}
		{
			stack <int> stk;
			for (int i=N;i;i--){
				while (!stk.empty() && A[stk.top()][j] <= A[i][j]) stk.pop();
				ver[i][j].sc = stk.empty() ? N : stk.top()-1;
				stk.push(i);
			}
		}
	}

	for (int i=1;i<=N;i++) for (int j=1;j<=M;j++){
		horizontal.pb({hor[i][j].fr, hor[i][j].sc, i});
		vertical.pb({ver[i][j].fr, ver[i][j].sc, j});
	}

	sort(all(horizontal));
	sort(all(vertical));
	for (auto i=horizontal.begin(),j=i;i!=horizontal.end();i++){
		while (*j < SEGMENT{i->a, i->b, i->t-1}) j++;
		if (*j == SEGMENT{i->a, i->b, i->t-1}) i->dp = j->dp+1;
		else i->dp = 1;
	}
	for (auto i=vertical.begin(),j=i;i!=vertical.end();i++){
		while (*j < SEGMENT{i->a, i->b, i->t-1}) j++;
		if (*j == SEGMENT{i->a, i->b, i->t-1}) i->dp = j->dp+1;
		else i->dp = 1;
	}

	vector <RECT> rects;
	for (int i=1;i<=N;i++) for (int j=1;j<=M;j++){
		int sy = ver[i][j].fr, ey = ver[i][j].sc;
		int sx = hor[i][j].fr, ex = hor[i][j].sc;

		if (sy == 1 || sx == 1 || ey == N || ex == M) continue;
		{
			auto it = lower_bound(all(vertical), SEGMENT{sy, ey, ex});
			if (it == vertical.end() || *it != SEGMENT{sy, ey, ex} || it->dp <= ex-sx) continue;
		}
		{
			auto it = lower_bound(all(horizontal), SEGMENT{sx, ex, ey});
			if (it == horizontal.end() || *it != SEGMENT{sx, ex, ey} || it->dp <= ey-sy) continue;
		}
		rects.pb({sy, sx, ey, ex});
	}
	sort(all(rects));
	rects.erase(unique(all(rects)), rects.end());
	return sz(rects);
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 760 KB Output is correct
3 Correct 3 ms 760 KB Output is correct
4 Correct 3 ms 760 KB Output is correct
5 Correct 2 ms 760 KB Output is correct
6 Correct 3 ms 760 KB Output is correct
7 Correct 2 ms 760 KB Output is correct
8 Correct 2 ms 476 KB Output is correct
9 Correct 3 ms 732 KB Output is correct
10 Correct 3 ms 764 KB Output is correct
11 Correct 3 ms 732 KB Output is correct
12 Correct 3 ms 760 KB Output is correct
13 Correct 2 ms 380 KB Output is correct
14 Correct 2 ms 504 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 2 ms 276 KB Output is correct
18 Correct 2 ms 376 KB Output is correct
19 Correct 2 ms 760 KB Output is correct
20 Correct 2 ms 760 KB Output is correct
21 Correct 2 ms 552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 760 KB Output is correct
3 Correct 3 ms 760 KB Output is correct
4 Correct 3 ms 760 KB Output is correct
5 Correct 2 ms 760 KB Output is correct
6 Correct 3 ms 760 KB Output is correct
7 Correct 2 ms 760 KB Output is correct
8 Correct 2 ms 476 KB Output is correct
9 Correct 3 ms 732 KB Output is correct
10 Correct 3 ms 764 KB Output is correct
11 Correct 3 ms 732 KB Output is correct
12 Correct 3 ms 760 KB Output is correct
13 Correct 2 ms 380 KB Output is correct
14 Correct 2 ms 504 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 5 ms 1912 KB Output is correct
18 Correct 6 ms 1960 KB Output is correct
19 Correct 5 ms 1912 KB Output is correct
20 Correct 6 ms 1912 KB Output is correct
21 Correct 6 ms 1812 KB Output is correct
22 Correct 6 ms 1912 KB Output is correct
23 Correct 6 ms 1888 KB Output is correct
24 Correct 4 ms 1528 KB Output is correct
25 Correct 2 ms 276 KB Output is correct
26 Correct 2 ms 376 KB Output is correct
27 Correct 2 ms 760 KB Output is correct
28 Correct 2 ms 760 KB Output is correct
29 Correct 2 ms 552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 760 KB Output is correct
3 Correct 3 ms 760 KB Output is correct
4 Correct 3 ms 760 KB Output is correct
5 Correct 2 ms 760 KB Output is correct
6 Correct 3 ms 760 KB Output is correct
7 Correct 2 ms 760 KB Output is correct
8 Correct 2 ms 476 KB Output is correct
9 Correct 3 ms 732 KB Output is correct
10 Correct 3 ms 764 KB Output is correct
11 Correct 3 ms 732 KB Output is correct
12 Correct 3 ms 760 KB Output is correct
13 Correct 2 ms 380 KB Output is correct
14 Correct 2 ms 504 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 5 ms 1912 KB Output is correct
18 Correct 6 ms 1960 KB Output is correct
19 Correct 5 ms 1912 KB Output is correct
20 Correct 6 ms 1912 KB Output is correct
21 Correct 6 ms 1812 KB Output is correct
22 Correct 6 ms 1912 KB Output is correct
23 Correct 6 ms 1888 KB Output is correct
24 Correct 4 ms 1528 KB Output is correct
25 Correct 23 ms 6628 KB Output is correct
26 Correct 23 ms 6608 KB Output is correct
27 Correct 23 ms 6604 KB Output is correct
28 Correct 23 ms 5588 KB Output is correct
29 Correct 28 ms 5620 KB Output is correct
30 Correct 28 ms 5640 KB Output is correct
31 Correct 29 ms 5896 KB Output is correct
32 Correct 29 ms 5540 KB Output is correct
33 Correct 2 ms 276 KB Output is correct
34 Correct 2 ms 376 KB Output is correct
35 Correct 2 ms 760 KB Output is correct
36 Correct 2 ms 760 KB Output is correct
37 Correct 2 ms 552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 760 KB Output is correct
3 Correct 3 ms 760 KB Output is correct
4 Correct 3 ms 760 KB Output is correct
5 Correct 2 ms 760 KB Output is correct
6 Correct 3 ms 760 KB Output is correct
7 Correct 2 ms 760 KB Output is correct
8 Correct 2 ms 476 KB Output is correct
9 Correct 3 ms 732 KB Output is correct
10 Correct 3 ms 764 KB Output is correct
11 Correct 3 ms 732 KB Output is correct
12 Correct 3 ms 760 KB Output is correct
13 Correct 2 ms 380 KB Output is correct
14 Correct 2 ms 504 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 5 ms 1912 KB Output is correct
18 Correct 6 ms 1960 KB Output is correct
19 Correct 5 ms 1912 KB Output is correct
20 Correct 6 ms 1912 KB Output is correct
21 Correct 6 ms 1812 KB Output is correct
22 Correct 6 ms 1912 KB Output is correct
23 Correct 6 ms 1888 KB Output is correct
24 Correct 4 ms 1528 KB Output is correct
25 Correct 23 ms 6628 KB Output is correct
26 Correct 23 ms 6608 KB Output is correct
27 Correct 23 ms 6604 KB Output is correct
28 Correct 23 ms 5588 KB Output is correct
29 Correct 28 ms 5620 KB Output is correct
30 Correct 28 ms 5640 KB Output is correct
31 Correct 29 ms 5896 KB Output is correct
32 Correct 29 ms 5540 KB Output is correct
33 Correct 180 ms 37956 KB Output is correct
34 Correct 169 ms 37876 KB Output is correct
35 Correct 178 ms 37872 KB Output is correct
36 Correct 167 ms 37824 KB Output is correct
37 Correct 275 ms 49976 KB Output is correct
38 Correct 277 ms 49860 KB Output is correct
39 Correct 278 ms 49976 KB Output is correct
40 Correct 257 ms 47524 KB Output is correct
41 Correct 237 ms 38512 KB Output is correct
42 Correct 280 ms 39680 KB Output is correct
43 Correct 353 ms 44384 KB Output is correct
44 Correct 360 ms 44336 KB Output is correct
45 Correct 189 ms 26592 KB Output is correct
46 Correct 174 ms 22476 KB Output is correct
47 Correct 382 ms 45616 KB Output is correct
48 Correct 373 ms 45624 KB Output is correct
49 Correct 2 ms 276 KB Output is correct
50 Correct 2 ms 376 KB Output is correct
51 Correct 2 ms 760 KB Output is correct
52 Correct 2 ms 760 KB Output is correct
53 Correct 2 ms 552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 1016 KB Output is correct
2 Correct 5 ms 888 KB Output is correct
3 Correct 4 ms 1016 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 6 ms 1016 KB Output is correct
6 Correct 6 ms 1020 KB Output is correct
7 Correct 5 ms 1016 KB Output is correct
8 Correct 5 ms 1016 KB Output is correct
9 Correct 5 ms 888 KB Output is correct
10 Correct 3 ms 504 KB Output is correct
11 Correct 4 ms 888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 504 KB Output is correct
2 Correct 1598 ms 182028 KB Output is correct
3 Correct 3691 ms 378940 KB Output is correct
4 Correct 3752 ms 380844 KB Output is correct
5 Correct 3735 ms 380896 KB Output is correct
6 Correct 930 ms 183876 KB Output is correct
7 Correct 1916 ms 365960 KB Output is correct
8 Correct 1947 ms 369092 KB Output is correct
9 Correct 2 ms 276 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
11 Correct 2 ms 760 KB Output is correct
12 Correct 2 ms 760 KB Output is correct
13 Correct 2 ms 552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 760 KB Output is correct
3 Correct 3 ms 760 KB Output is correct
4 Correct 3 ms 760 KB Output is correct
5 Correct 2 ms 760 KB Output is correct
6 Correct 3 ms 760 KB Output is correct
7 Correct 2 ms 760 KB Output is correct
8 Correct 2 ms 476 KB Output is correct
9 Correct 3 ms 732 KB Output is correct
10 Correct 3 ms 764 KB Output is correct
11 Correct 3 ms 732 KB Output is correct
12 Correct 3 ms 760 KB Output is correct
13 Correct 2 ms 380 KB Output is correct
14 Correct 2 ms 504 KB Output is correct
15 Correct 2 ms 376 KB Output is correct
16 Correct 2 ms 376 KB Output is correct
17 Correct 5 ms 1912 KB Output is correct
18 Correct 6 ms 1960 KB Output is correct
19 Correct 5 ms 1912 KB Output is correct
20 Correct 6 ms 1912 KB Output is correct
21 Correct 6 ms 1812 KB Output is correct
22 Correct 6 ms 1912 KB Output is correct
23 Correct 6 ms 1888 KB Output is correct
24 Correct 4 ms 1528 KB Output is correct
25 Correct 23 ms 6628 KB Output is correct
26 Correct 23 ms 6608 KB Output is correct
27 Correct 23 ms 6604 KB Output is correct
28 Correct 23 ms 5588 KB Output is correct
29 Correct 28 ms 5620 KB Output is correct
30 Correct 28 ms 5640 KB Output is correct
31 Correct 29 ms 5896 KB Output is correct
32 Correct 29 ms 5540 KB Output is correct
33 Correct 180 ms 37956 KB Output is correct
34 Correct 169 ms 37876 KB Output is correct
35 Correct 178 ms 37872 KB Output is correct
36 Correct 167 ms 37824 KB Output is correct
37 Correct 275 ms 49976 KB Output is correct
38 Correct 277 ms 49860 KB Output is correct
39 Correct 278 ms 49976 KB Output is correct
40 Correct 257 ms 47524 KB Output is correct
41 Correct 237 ms 38512 KB Output is correct
42 Correct 280 ms 39680 KB Output is correct
43 Correct 353 ms 44384 KB Output is correct
44 Correct 360 ms 44336 KB Output is correct
45 Correct 189 ms 26592 KB Output is correct
46 Correct 174 ms 22476 KB Output is correct
47 Correct 382 ms 45616 KB Output is correct
48 Correct 373 ms 45624 KB Output is correct
49 Correct 5 ms 1016 KB Output is correct
50 Correct 5 ms 888 KB Output is correct
51 Correct 4 ms 1016 KB Output is correct
52 Correct 2 ms 376 KB Output is correct
53 Correct 6 ms 1016 KB Output is correct
54 Correct 6 ms 1020 KB Output is correct
55 Correct 5 ms 1016 KB Output is correct
56 Correct 5 ms 1016 KB Output is correct
57 Correct 5 ms 888 KB Output is correct
58 Correct 3 ms 504 KB Output is correct
59 Correct 4 ms 888 KB Output is correct
60 Correct 2 ms 504 KB Output is correct
61 Correct 1598 ms 182028 KB Output is correct
62 Correct 3691 ms 378940 KB Output is correct
63 Correct 3752 ms 380844 KB Output is correct
64 Correct 3735 ms 380896 KB Output is correct
65 Correct 930 ms 183876 KB Output is correct
66 Correct 1916 ms 365960 KB Output is correct
67 Correct 1947 ms 369092 KB Output is correct
68 Correct 2807 ms 369200 KB Output is correct
69 Correct 2605 ms 369244 KB Output is correct
70 Correct 2766 ms 369224 KB Output is correct
71 Correct 2496 ms 369172 KB Output is correct
72 Correct 4124 ms 499208 KB Output is correct
73 Correct 3253 ms 283688 KB Output is correct
74 Correct 3418 ms 332608 KB Output is correct
75 Execution timed out 5088 ms 439620 KB Time limit exceeded
76 Halted 0 ms 0 KB -