Submission #1290748

#TimeUsernameProblemLanguageResultExecution timeMemory
1290748SofiatpcRectangles (IOI19_rect)C++20
59 / 100
5092 ms71124 KiB
#include "rect.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2505;
int mxl[MAXN][MAXN], mxr[MAXN][MAXN], mxu[MAXN][MAXN], mxd[MAXN][MAXN];

long long count_rectangles(vector<vector<int> > a) {
	int n = a.size(), m = a[0].size();

	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			mxl[i][j] = 1;
			for(int k = j-1; k >= 1; k--)
				if(a[i-1][k-1] >= a[i-1][j-1]){mxl[i][j] = k+1; break;}

			mxr[i][j] = m;
			for(int k = j+1; k <= m; k++)
				if(a[i-1][k-1] >= a[i-1][j-1]){mxr[i][j] = k-1; break;}

			mxu[i][j] = 1;
			for(int k = i-1; k >= 1; k--)
				if(a[k-1][j-1] >= a[i-1][j-1]){mxu[i][j] = k+1; break;}

			mxd[i][j] = n;
			for(int k = i+1; k <= n; k++)
				if(a[k-1][j-1] >= a[i-1][j-1]){mxd[i][j] = k-1; break;}
		}
	}

	long long ans = 0;
	for(int i1 = 2; i1 < n; i1++){
		for(int j1 = 2; j1 < m; j1++){
			int ej = m;
			for(int i2 = i1; i2 < n; i2++){
				ej = min(ej, mxr[i2][j1-1]);

				for(int j2 = j1; j2 <= min(m-1,ej); j2++){
					if(mxd[i1-1][j2] < i2 || mxu[i2+1][j2] > i1)break;
					long long aux = 1;
					for(int i = i1; i <= i2; i++)
						if(mxl[i][j2+1] > j1){aux = 0; break;}
						ans += aux;
				}
			}
		}
	}
	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...