Submission #1370273

#TimeUsernameProblemLanguageResultExecution timeMemory
1370273kawhietRectangles (IOI19_rect)C++20
10 / 100
1570 ms67972 KiB
#include <bits/stdc++.h>
#include "rect.h"
using namespace std;

long long count_rectangles(vector<vector<int>> a) {
	int n = a.size();
	int m = a[0].size();
	vector<vector<int>> left(n + 1, vector<int>(m + 1));
	vector<vector<int>> right(n + 1, vector<int>(m + 1));
	vector<vector<int>> top(n + 1, vector<int>(m + 1));
	vector<vector<int>> bot(n + 1, vector<int>(m + 1));
	for (int i = 0; i < n; i++) {
		for (int j = 1; j < m; j++) {
			left[i + 1][j + 1] = left[i + 1][j] + left[i][j + 1] - left[i][j] + (a[i][j] >= a[i][j - 1]); 
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m - 1; j++) {
			right[i + 1][j + 1] = right[i + 1][j] + right[i][j + 1] - right[i][j] + (a[i][j] >= a[i][j + 1]);
		}
	}
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < m; j++) {
			bot[i + 1][j + 1] = bot[i + 1][j] + bot[i][j + 1] - bot[i][j] + (a[i][j] >= a[i + 1][j]);
		}
	}
	for (int i = 1; i < n; i++) {
		for (int j = 0; j < m; j++) {
			top[i + 1][j + 1] = top[i + 1][j] + top[i][j + 1] - top[i][j] + (a[i][j] >= a[i - 1][j]);
		}
	}
	auto get = [&](vector<vector<int>> &p, int x1, int y1, int x2, int y2) {
		x1++; y1++; x2++; y2++;
		return p[x2][y2] - p[x2][y1 - 1] - p[x1 - 1][y2] + p[x1 - 1][y1 - 1];
	};
	long long ans = 0;
	for (int r1 = 1; r1 < n - 1; r1++) {
		for (int r2 = r1; r2 < n - 1; r2++) {
			for (int c1 = 1; c1 < m - 1; c1++) {
				if (get(left, r1, c1, r2, c1) != 0) continue;
				if (a[r1][c1] >= a[r1 - 1][c1]) continue;
				if (a[r2][c1] >= a[r2 + 1][c1]) continue;
				int l = c1, r = m - 1;
				while (l + 1 < r) {
					int mid = (l + r) / 2;
					if (get(top, r1, c1, r1, mid) == 0 && get(bot, r1, c1, r1, mid) == 0) {
						l = mid;
					} else {
						r = mid;
					}
				}
				for (int c2 = c1; c2 <= l; c2++) {
					bool ok = true;
					for (int i = r1; i <= r2; i++) {
						for (int j = c1; j <= c2; j++) {
							int x = min({a[i][c1 - 1], a[i][c2 + 1], a[r1 - 1][j], a[r2 + 1][j]});
							if (a[i][j] >= x) {
								ok = false;
								break;
							}
						}
						if (!ok) {
							break;
						}
					}
					ans += ok;
				}
			}
		}
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...