Submission #1241518

#TimeUsernameProblemLanguageResultExecution timeMemory
1241518The_SamuraiRectangles (IOI19_rect)C++20
49 / 100
1931 ms738864 KiB
#include "rect.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;

const int N = 700;
short pref2[N][N][N];
vector<vector<vector<bool>>> pref1(N, vector<vector<bool>>(N, vector<bool>(N)));

long long count_rectangles(std::vector<std::vector<int> > a) {
	int n = a.size(), m = a[0].size();
	// vector<basic_string<vector<short>>> pref1(m, vector<vector<short>>(n, vector<short>(n)));
	for (int l = 0; l + 1 < n; l++) {
		for (int j = 1; j + 1 < m; j++) {
			int mx = a[l + 1][j];
			for (int r = l + 2; r < n; r++) {
				pref1[j][l][r] = (min(a[l][j], a[r][j]) > mx);
				mx = max(mx, a[r][j]);
			}
		}
	}
	// vector<basic_string<vector<short>>> pref2(n, vector<vector<short>>(m, vector<short>(m)));
	for (int l = 0; l + 1 < m; l++) {
		for (int i = 1; i + 1 < n; i++) {
			int mx = a[i][l + 1];
			for (int r = l + 2; r < m; r++) {
				pref2[i][l][r] = pref2[i - 1][l][r] + (min(a[i][l], a[i][r]) > mx);
				mx = max(mx, a[i][r]);
			}
		}
	}

	ll ans = 0;
	for (int l1 = 0; l1 < n; l1++) {
		for (int r1 = l1 + 2; r1 < n; r1++) {
			for (int l2 = 0; l2 < m; l2++) {
				for (int r2 = l2 + 2; r2 < m; r2++) {
					if (!pref1[r2 - 1][l1][r1]) break;
					ans += pref2[r1 - 1][l2][r2] - pref2[l1][l2][r2] == r1 - l1 - 1;
				}
			}
		}
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...