Submission #348018

#TimeUsernameProblemLanguageResultExecution timeMemory
348018tengiz05Rectangles (IOI19_rect)C++17
15 / 100
5052 ms69100 KiB
#include "rect.h"
#ifndef EVAL
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("O3")
using namespace std;
typedef long long ll;
const int N = 2505;
int n, m, tr[N][N], tc[N][N];
vector<vector<int>> a;
inline bool check(int r1, int c1, int r2, int c2){
	int l, r;
	for(int i=r1;i<=r2;i++){
		int t = min(a[i][c1-1], a[i][c2+1]);
		l=c1+m,r=c2+m;
		int res=0;
		for(;l<=r;l>>=1,r>>=1){
			if((l&1))res=max(res,tr[i][l++]);
			if(!(r&1))res=max(res,tr[i][r--]);
		}
		if(res >= t)return false;
	}
	for(int i=c1;i<=c2;i++){
		int t = min(a[r1-1][i], a[r2+1][i]);
		l=r1+n,r=r2+n;
		int res=0;
		for(;l<=r;l>>=1,r>>=1){
			if((l&1))res=max(res,tc[i][l++]);
			if(!(r&1))res=max(res,tc[i][r--]);
		}
		if(res >= t)return false;	
	}
	return true;
}

ll count_rectangles(vector<vector<int>> a){
	::a = a;
	n = a.size();
	m = a[0].size();
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			tr[i][j+m] = a[i][j];
		}for(int j=m-1;j>0;j--){
			tr[i][j] = max(tr[i][j<<1],tr[i][j<<1|1]);
		}
	}
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			tc[i][j+n] = a[j][i];
		}for(int j=n-1;j>0;j--){
			tc[i][j] = max(tc[i][j<<1],tc[i][j<<1|1]);
		}
	}
	ll ans = 0;
	for(int i=1;i<n-1;i++){
		for(int j=1;j<m-1;j++){
			for(int I=i;I<n-1;I++){
				for(int J=j;J<m-1;J++){
					ans += check(i,j,I,J);
				}
			}
		}
	}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...