Submission #297494

#TimeUsernameProblemLanguageResultExecution timeMemory
297494SaboonRectangles (IOI19_rect)C++17
72 / 100
5051 ms573880 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2500 + 10;
vector<pair<int,int>> row[maxn][maxn], col[maxn][maxn];
int pre[maxn];
int dp[maxn][maxn];

long long count_rectangles(vector<vector<int>> a){
	int n = a.size(), m = a[0].size();
	for (int i = 1; i < n-1; i++){
		for (int j = 0; j < m; j++){
			pre[j] = j-1;
			while (pre[j] != -1 and a[i][j] > a[i][pre[j]])
				pre[j] = pre[pre[j]];
			if (pre[j] == -1 or a[i][pre[j]] == a[i][j] or pre[j] == j-1)
				continue;
			row[i][pre[j]+1].push_back({j-1,1});
		}
		for (int j = m-1; j >= 0; j--){
			pre[j] = j+1;
			while (pre[j] != m and a[i][j] > a[i][pre[j]])
				pre[j] = pre[pre[j]];
			if (pre[j] == j+1 or pre[j] == m)
				continue;
			row[i][j+1].push_back({pre[j]-1,1});
		}
	}
	for (int i = n-2; i >= 0; i--){
		for (int j = 0; j < m; j++)
			for (auto [x,cnt] : row[i][j])
				dp[j][x] = -1 * (dp[j][x]+1);
		for (int j = 0; j < m; j++)
			for (auto [x,cnt] : row[i+1][j])
				if (dp[j][x] > 0)
					dp[j][x] = 0;
		for (int j = 0; j < m; j++)
			for (auto &[x,cnt] : row[i][j])
				dp[j][x] *= -1, cnt = dp[j][x];
	}
	for (int j = 1; j < m-1; j++){
		for (int i = 0; i < n; i++){
			pre[i] = i-1;
			while (pre[i] != -1 and a[i][j] > a[pre[i]][j])
				pre[i] = pre[pre[i]];
			if (pre[i] == -1 or a[i][j] == a[pre[i]][j] or pre[i] == i-1)
				continue;
			col[pre[i]+1][j].push_back({i-1,1});
		}
		for (int i = n-1; i >= 0; i--){
			pre[i] = i+1;
			while (pre[i] != n and a[i][j] > a[pre[i]][j])
				pre[i] = pre[pre[i]];
			if (pre[i] == i+1 or pre[i] == n)
				continue;
			col[i+1][j].push_back({pre[i]-1,1});
		}
	}
	for (int j = m-2; j >= 1; j--){
		for (int i = 0; i < n; i++)
			for (auto [x,cnt] : col[i][j])
				dp[i][x] = -1 * (dp[i][x]+1);
		for (int i = 0; i < n; i++)
			for (auto [x,cnt] : col[i][j+1])
				if (dp[i][x] > 0)
					dp[i][x] = 0;
		for (int i = 0; i < n; i++)
			for (auto &[x,cnt] : col[i][j])
				dp[i][x] *= -1, cnt = dp[i][x];
	}
	ll ret = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			for (auto [x,c1] : row[i][j])
				for (auto [y,c2] : col[i][j])
					if (c1 >= y-i+1 and c2 >= x-j+1)
						ret ++;
	return ret;
}
#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...