제출 #286090

#제출 시각아이디문제언어결과실행 시간메모리
286090kshitij_sodaniRectangles (IOI19_rect)C++14
31 / 100
772 ms404948 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
//#define endl '\n' 


#include "rect.h"
vector<vector<int>> it;
vector<int> x={1,-1,0,0};
vector<int> y={0,0,-1,1};
int vis[2501][2501];
int n,m;
vector<pair<int,int>> comp;
void dfs(int i,int j){
	vis[i][j]=1;
	comp.pb({i,j});
	//<<i<<",,"<<j<<endl;
	for(int ii=0;ii<4;ii++){
		int xx=i+x[ii];
		int yy=j+y[ii];
		if(xx<0 or yy<0 or xx>=n or yy>=m){
			continue;
		}
		if(it[xx][yy]==0){
			if(vis[xx][yy]==0){
				dfs(xx,yy);
			}
		}
	}
}
int val[201][201][201];
int val2[201][201][201];
bool val3[71][71][71][71];
bool val4[71][71][71][71];
llo count_rectangles(vector<vector<int>> ac) {
	it=ac;
	/*for(auto j:ac){
		for(auto i:j){
			cout<<i<<".";
		}
		cout<<endl;
	}*/
	n=it.size();
	m=it[0].size();
	if(n<=2 or m<=2){
		return 0;
	}
	if(n==3){
		llo co=0;
		for(int i=1;i<m-1;i++){
			int ma=it[1][i];

			for(int j=i;j<m-1;j++){
				if(it[1][j]>=min(it[0][j],it[2][j])){
					break;
				}
				ma=max(ma,it[1][j]);
				if(ma<min(it[1][i-1],it[1][j+1])){
					co+=1;
				}
			}
		}
		return co;
	}
	int stt=1;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(it[i][j]>1){
				stt=0;
			}
		}
	}
	if(stt){
		int co=0;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				comp.clear();
				if(it[i][j]==0){
					if(vis[i][j]==0){
						dfs(i,j);
						int mi1=0;
						int mi2=n;
						int ma1=0;
						int ma2=m;
						int st=1;
						for(auto jj:comp){
							mi1=max(mi1,jj.a);
							mi2=min(mi2,jj.a);
							ma1=max(ma1,jj.b);
							ma2=min(ma2,jj.b);
							if(jj.a==0 or jj.a==n-1 or jj.b==0 or jj.b==m-1){
								st=0;
							}
						}
						if((int)(comp.size())==(mi1-mi2+1)*(ma1-ma2+1)){
							co+=st;
						//	cout<<i<<":"<<j<<endl;
						}
					}
				}
			}
		}
		return co;
	}

	for(int j=1;j<m-1;j++){
		for(int i=1;i<n-1;i++){
			int ma=it[i][j];
			for(int ii=i;ii<n-1;ii++){
				ma=max(ma,it[ii][j]);
				if(ma<min(it[i-1][j],it[ii+1][j])){
					val[j][i][ii]=1;
				}
			}
		}
	}
	for(int j=1;j<n-1;j++){
		for(int i=1;i<m-1;i++){
			int ma=it[j][i];
			for(int ii=i;ii<m-1;ii++){
				ma=max(ma,it[j][ii]);
				if(ma<min(it[j][i-1],it[j][ii+1])){
					val2[j][i][ii]=1;
				}
			}
		}
	}
	for(int j=1;j<m-1;j++){
		for(int i=1;i<n-1;i++){
			for(int ii=i;ii<n-1;ii++){
				for(int jj=j;jj<m-1;jj++){
					if(val[jj][i][ii]==0){
						break;
					}
					val3[i][ii][j][jj]=1;
				}
			}
		}
	}
	llo ans2=0;
	for(int j=1;j<n-1;j++){
		for(int i=1;i<m-1;i++){
			for(int ii=i;ii<m-1;ii++){
				for(int jj=j;jj<n-1;jj++){
					if(val2[jj][i][ii]==0){
						break;
					}
					val3[j][jj][i][ii]&=1;
					ans2+=val3[j][jj][i][ii];
				}
			}
		}
	}

	

	












	return ans2;
}
#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...