답안 #535989

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
535989 2022-03-12T03:21:26 Z KoD Rectangles (IOI19_rect) C++17
100 / 100
2143 ms 322328 KB
#include <bits/stdc++.h>
#include "rect.h"

using ll = long long;
using namespace std;

struct fenwick {
	vector<int> data;
	explicit fenwick(const int n) : data(n + 1) {}
	void add(int i, const int x) {
		for (i += 1; i < (int)data.size(); i += i & -i) data[i] += x;
	}
	int pref(int i) const {
		int ret = 0;
		for (; i > 0; i -= i & -i) ret += data[i];
		return ret;
	}
	int fold(const int l, const int r) const {
		return pref(r) - pref(l);
	}
};

template <class F> vector<pair<int, int>> enumerate(const int n, const F& f) {
	vector<pair<int, int>> valid;
	vector<int> stack;
	for (int i = 0; i < n; ++i) {
		int sofar = 0;
		const int r = f(i);
		while (!stack.empty()) {
			const int j = stack.back();
			const int l = f(j);
			if (min(l, r) > sofar and i - j > 1) valid.emplace_back(j, i);
			if (l >= r) break;
			stack.pop_back();
			sofar = max(sofar, l);
		}
		stack.push_back(i);
	}
	return valid;
}

ll count_rectangles(vector<vector<int>> a) {
	const int n = a.size();
	const int m = a[0].size();
	if (n <= 2 or m <= 2) return 0;
	vector fix_down(n, vector<vector<int>>(m));
	for (int j = 0; j < m; ++j) {
		for (const auto& [u, d] : enumerate(n, [&](const int i) { return a[i][j]; })) {
			fix_down[d][j].push_back(u);
		}
	}
	vector<tuple<int, int, int>> lr;
	for (const auto& [l, r] : enumerate(m, [&](const int j) { return a[1][j]; })) {
		lr.emplace_back(l, r, 0);
	}
	vector valid_up(n, fenwick(m));
	int count = 0;
	for (int down = 2; down < n; ++down) {
		for (int j = 0; j < m; ++j) {
			for (const int up : fix_down[down][j]) valid_up[up].add(j, 1);
		}
		for (const auto& [l, r, u] : lr) {
			for (const int up : fix_down[down][l + 1]) {
				if (up < u) break;
				if (valid_up[up].fold(l + 1, r) == r - l - 1) count += 1;
			}
		}
		if (down + 1 < n) {
			vector<tuple<int, int, int>> next;
			int idx = 0;
			for (const auto& [l, r] : enumerate(m, [&](const int j) { return a[down][j]; })) {
				bool done = false;
				while (idx < (int)lr.size()) {
					const auto& [l0, r0, u] = lr[idx];
					if (l0 == l and r0 == r) {
						next.emplace_back(l, r, u);
						done = true;
						break;
					}
					if (r0 < r or (r0 == r and l0 > l)) {
						idx += 1;
					} else {
						break;
					}
				}
				if (!done) next.emplace_back(l, r, down - 1);
			}
			lr = std::move(next);
			for (int j = 0; j < m; ++j) {
				for (const int up : fix_down[down][j]) valid_up[up].add(j, -1);
			}
		}
	}
	return count;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 276 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 340 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 276 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 0 ms 212 KB Output is correct
18 Correct 0 ms 212 KB Output is correct
19 Correct 1 ms 340 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 1 ms 468 KB Output is correct
23 Correct 1 ms 468 KB Output is correct
24 Correct 1 ms 468 KB Output is correct
25 Correct 1 ms 596 KB Output is correct
26 Correct 2 ms 636 KB Output is correct
27 Correct 2 ms 596 KB Output is correct
28 Correct 2 ms 596 KB Output is correct
29 Correct 1 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 276 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 1 ms 468 KB Output is correct
20 Correct 1 ms 596 KB Output is correct
21 Correct 2 ms 636 KB Output is correct
22 Correct 2 ms 596 KB Output is correct
23 Correct 2 ms 596 KB Output is correct
24 Correct 1 ms 468 KB Output is correct
25 Correct 0 ms 212 KB Output is correct
26 Correct 0 ms 212 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 212 KB Output is correct
29 Correct 0 ms 212 KB Output is correct
30 Correct 5 ms 1876 KB Output is correct
31 Correct 5 ms 1876 KB Output is correct
32 Correct 6 ms 1876 KB Output is correct
33 Correct 8 ms 2132 KB Output is correct
34 Correct 10 ms 2260 KB Output is correct
35 Correct 10 ms 2260 KB Output is correct
36 Correct 9 ms 2260 KB Output is correct
37 Correct 9 ms 2260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 276 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 1 ms 468 KB Output is correct
20 Correct 1 ms 596 KB Output is correct
21 Correct 2 ms 636 KB Output is correct
22 Correct 2 ms 596 KB Output is correct
23 Correct 2 ms 596 KB Output is correct
24 Correct 1 ms 468 KB Output is correct
25 Correct 5 ms 1876 KB Output is correct
26 Correct 5 ms 1876 KB Output is correct
27 Correct 6 ms 1876 KB Output is correct
28 Correct 8 ms 2132 KB Output is correct
29 Correct 10 ms 2260 KB Output is correct
30 Correct 10 ms 2260 KB Output is correct
31 Correct 9 ms 2260 KB Output is correct
32 Correct 9 ms 2260 KB Output is correct
33 Correct 0 ms 212 KB Output is correct
34 Correct 0 ms 212 KB Output is correct
35 Correct 1 ms 340 KB Output is correct
36 Correct 1 ms 212 KB Output is correct
37 Correct 0 ms 212 KB Output is correct
38 Correct 42 ms 19040 KB Output is correct
39 Correct 56 ms 19032 KB Output is correct
40 Correct 75 ms 25292 KB Output is correct
41 Correct 69 ms 25324 KB Output is correct
42 Correct 54 ms 20448 KB Output is correct
43 Correct 54 ms 20432 KB Output is correct
44 Correct 54 ms 20468 KB Output is correct
45 Correct 53 ms 19296 KB Output is correct
46 Correct 56 ms 21464 KB Output is correct
47 Correct 79 ms 22736 KB Output is correct
48 Correct 131 ms 25476 KB Output is correct
49 Correct 123 ms 25464 KB Output is correct
50 Correct 60 ms 12972 KB Output is correct
51 Correct 65 ms 12876 KB Output is correct
52 Correct 136 ms 24836 KB Output is correct
53 Correct 124 ms 24908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 724 KB Output is correct
2 Correct 1 ms 596 KB Output is correct
3 Correct 1 ms 596 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 596 KB Output is correct
8 Correct 1 ms 596 KB Output is correct
9 Correct 1 ms 596 KB Output is correct
10 Correct 1 ms 252 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 422 ms 123776 KB Output is correct
8 Correct 990 ms 268276 KB Output is correct
9 Correct 939 ms 269548 KB Output is correct
10 Correct 966 ms 269696 KB Output is correct
11 Correct 138 ms 109052 KB Output is correct
12 Correct 275 ms 207148 KB Output is correct
13 Correct 322 ms 220764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 276 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 1 ms 468 KB Output is correct
20 Correct 1 ms 596 KB Output is correct
21 Correct 2 ms 636 KB Output is correct
22 Correct 2 ms 596 KB Output is correct
23 Correct 2 ms 596 KB Output is correct
24 Correct 1 ms 468 KB Output is correct
25 Correct 5 ms 1876 KB Output is correct
26 Correct 5 ms 1876 KB Output is correct
27 Correct 6 ms 1876 KB Output is correct
28 Correct 8 ms 2132 KB Output is correct
29 Correct 10 ms 2260 KB Output is correct
30 Correct 10 ms 2260 KB Output is correct
31 Correct 9 ms 2260 KB Output is correct
32 Correct 9 ms 2260 KB Output is correct
33 Correct 42 ms 19040 KB Output is correct
34 Correct 56 ms 19032 KB Output is correct
35 Correct 75 ms 25292 KB Output is correct
36 Correct 69 ms 25324 KB Output is correct
37 Correct 54 ms 20448 KB Output is correct
38 Correct 54 ms 20432 KB Output is correct
39 Correct 54 ms 20468 KB Output is correct
40 Correct 53 ms 19296 KB Output is correct
41 Correct 56 ms 21464 KB Output is correct
42 Correct 79 ms 22736 KB Output is correct
43 Correct 131 ms 25476 KB Output is correct
44 Correct 123 ms 25464 KB Output is correct
45 Correct 60 ms 12972 KB Output is correct
46 Correct 65 ms 12876 KB Output is correct
47 Correct 136 ms 24836 KB Output is correct
48 Correct 124 ms 24908 KB Output is correct
49 Correct 1 ms 724 KB Output is correct
50 Correct 1 ms 596 KB Output is correct
51 Correct 1 ms 596 KB Output is correct
52 Correct 0 ms 212 KB Output is correct
53 Correct 1 ms 596 KB Output is correct
54 Correct 1 ms 596 KB Output is correct
55 Correct 1 ms 596 KB Output is correct
56 Correct 1 ms 596 KB Output is correct
57 Correct 1 ms 596 KB Output is correct
58 Correct 1 ms 252 KB Output is correct
59 Correct 1 ms 340 KB Output is correct
60 Correct 1 ms 212 KB Output is correct
61 Correct 422 ms 123776 KB Output is correct
62 Correct 990 ms 268276 KB Output is correct
63 Correct 939 ms 269548 KB Output is correct
64 Correct 966 ms 269696 KB Output is correct
65 Correct 138 ms 109052 KB Output is correct
66 Correct 275 ms 207148 KB Output is correct
67 Correct 322 ms 220764 KB Output is correct
68 Correct 0 ms 212 KB Output is correct
69 Correct 0 ms 212 KB Output is correct
70 Correct 1 ms 340 KB Output is correct
71 Correct 1 ms 212 KB Output is correct
72 Correct 0 ms 212 KB Output is correct
73 Correct 653 ms 239260 KB Output is correct
74 Correct 759 ms 239216 KB Output is correct
75 Correct 1364 ms 318888 KB Output is correct
76 Correct 1436 ms 318924 KB Output is correct
77 Correct 976 ms 261204 KB Output is correct
78 Correct 1221 ms 193244 KB Output is correct
79 Correct 1197 ms 203692 KB Output is correct
80 Correct 2029 ms 321968 KB Output is correct
81 Correct 1232 ms 193560 KB Output is correct
82 Correct 1604 ms 257940 KB Output is correct
83 Correct 2143 ms 322328 KB Output is correct
84 Correct 1148 ms 189080 KB Output is correct
85 Correct 1991 ms 315380 KB Output is correct
86 Correct 1973 ms 306440 KB Output is correct
87 Correct 666 ms 157116 KB Output is correct
88 Correct 1025 ms 260940 KB Output is correct
89 Correct 953 ms 261120 KB Output is correct
90 Correct 1049 ms 261124 KB Output is correct