Submission #425151

#TimeUsernameProblemLanguageResultExecution timeMemory
425151alireza_kavianiRectangles (IOI19_rect)C++14
72 / 100
5046 ms394420 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define SZ(x)		int((x).size())
#define sep			' '

const int MAXN = 2510;
const int MOD = 1e9 + 7;

int n , m , L[MAXN][MAXN] , R[MAXN][MAXN];
vector<int> vec[MAXN][MAXN];

int solve(int x , int y , int l , int r){
	vector<pii> ans;
	for(int i = l ; i <= r ; i++){
		if(l <= L[x + 1][i] && L[x + 1][i] + 1 != i)	ans.push_back({L[x + 1][i] , i});
		if(R[x + 1][i] <= r && i + 1 != R[x + 1][i])	ans.push_back({i , R[x + 1][i]});
	}
	for(int i = x + 2 ; i < y ; i++){
		vector<pii> cur;
		for(pii j : ans){
			int a = j.first , b = j.second;
			if(R[i][a] == b || L[i][b] == a)	cur.push_back(j);
		}
		ans = cur;
	}
//	cout << x << sep << y << sep << l << sep << r << sep << SZ(ans) << endl;
	return SZ(ans);
}

ll count_rectangles(vector<vector<int>> a) {
	for(int i = 0 ; i < MAXN ; i++){
		fill(L[i] , L[i] + MAXN , -1);
		fill(R[i] , R[i] + MAXN , MOD);
	}
	n = SZ(a) , m = SZ(a[0]); ll ans = 0;
	for(int i = 1 ; i + 1 < n ; i++){
		vector<int> stk;
		for(int j = 0 ; j < m ; j++){
			int flag = 0;
			while(SZ(stk) && a[i][j] >= a[i][stk.back()]){
				vec[stk.back()][j].push_back(i);
				if(a[i][j] == a[i][stk.back()])	flag = 1;
//				cout << stk.back() << sep << j << sep << i << endl;
				stk.pop_back();
			}
			if(SZ(stk) && flag == 0)	vec[stk.back()][j].push_back(i);
			stk.push_back(j);
		}
	}
	for(int i = 0 ; i < m ; i++){
		vector<int> stk;
		for(int j = 0 ; j < n ; j++){
			int flag = 0;
			while(SZ(stk) && a[j][i] >= a[stk.back()][i]){
				R[i][stk.back()] = j;
				if(a[j][i] == a[stk.back()][i])	flag = 1;
				stk.pop_back();
			}
			if(SZ(stk) && flag == 0)	L[i][j] = stk.back();
			stk.push_back(j);
		}
	}
	for(int i = 0 ; i < m ; i++){
		for(int j = i + 2 ; j < m ; j++){
			vec[i][j].push_back(MOD);
			int first = -1;
			for(int k = 0 ; k < SZ(vec[i][j]) ; k++){
				if(k == 0 || vec[i][j][k] != vec[i][j][k - 1] + 1){
					if(first != -1)	ans += solve(i , j , first - 1 , vec[i][j][k - 1] + 1);
					first = vec[i][j][k];
				}
			}
		}
	}

	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...