Submission #384297

#TimeUsernameProblemLanguageResultExecution timeMemory
384297kshitij_sodaniRectangles (IOI19_rect)C++14
72 / 100
5089 ms726860 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;
int n,m;

int le[2501][2501];
int re[2501][2501];
int uu[2501][2501];
int dd[2501][2501];
vector<pair<int,int>> pre[2501][2501];

vector<int> x={1,-1,0,0};
vector<int> y={0,0,-1,1};
int vis[2501][2501];

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 check(int aa,int bb,int cc,int ee){
	if(aa<=0 or aa>=n-1){
		return 0;
	}
	if(cc<=0 and cc>=n-1){
		return 0;
	}
	if(bb<=0 or bb>=m-1){
		return 0;
	}
	if(ee<=0 and ee>=m-1){
		return 0;
	}
	if(cc<aa or ee<bb){
		return 0;
	}
	/*if(aa==1 and bb==1 and cc==1 and ee==1){
		cout<<11<<endl;
		cout<<re[1][bb-1]<<":"<<le[1][ee+1]<<endl;
	}*/
	for(int i=aa;i<=cc;i++){
		int xx=min(it[i][bb-1],it[i][ee+1]);
		if(xx==it[i][bb-1]){
			if(re[i][bb-1]==ee+1){
				continue;
			}
		}
		if(xx==it[i][ee+1]){
			if(le[i][ee+1]==bb-1){
				continue;
			}
		}
		return 0;
	}
	for(int i=bb;i<=ee;i++){
		int xx=min(it[aa-1][i],it[cc+1][i]);
		if(it[aa-1][i]==xx){
			if(dd[aa-1][i]==cc+1){
				continue;
			}
		}
		if(xx==it[cc+1][i]){
			if(uu[cc+1][i]==aa-1){
				continue;
			}
		}
		return 0;
	}
	//cout<<aa<<":"<<bb<<":"<<cc<<":"<<ee<<endl;
	return 1;
}
llo count_rectangles(vector<vector<int>> ac) {
	it=ac;
	n=it.size();
	m=it[0].size();


	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 i=0;i<n;i++){
		vector<pair<int,int>> ss;

		for(int j=0;j<m;j++){
			while(ss.size()){
				if(ss.back().a<it[i][j]){
					ss.pop_back();
				}
				else{
					break;
				}
			}
			le[i][j]=-1;
			if(ss.size()){
				le[i][j]=ss.back().b;
				pre[i][ss.back().b].pb({i,j});
			}
			ss.pb({it[i][j],j});

		}
	}
	for(int i=0;i<n;i++){
		vector<pair<int,int>> ss;

		for(int j=m-1;j>=0;j--){
			while(ss.size()){
				if(ss.back().a<it[i][j]){
					ss.pop_back();
				}
				else{
					break;
				}
			}
			re[i][j]=-1;
			if(ss.size()){
				if(ss.back().a!=it[i][j]){
					re[i][j]=ss.back().b;
				}
			}

			ss.pb({it[i][j],j});
		}
	}
	/*for(int j=0;j<m;j++){
		cout<<re[1][j]<<".";
	}
	cout<<endl;*/

	for(int j=0;j<m;j++){
		vector<pair<int,int>> ss;
		for(int i=0;i<n;i++){
			while(ss.size()){
				if(ss.back().a<it[i][j]){
					ss.pop_back();
				}
				else{
					break;
				}
			}
			uu[i][j]=-1;
			if(ss.size()){
				uu[i][j]=ss.back().b;
			}
			ss.pb({it[i][j],i});
		}
	}
	for(int j=0;j<m;j++){
		vector<pair<int,int>> ss;
		for(int i=n-1;i>=0;i--){
			while(ss.size()){
				if(ss.back().a<it[i][j]){
					ss.pop_back();
				}
				else{
					break;
				}
			}
			dd[i][j]=-1;
			if(ss.size()){
				if(ss.back().a!=it[i][j]){
					dd[i][j]=ss.back().b;
				}
			}
			ss.pb({it[i][j],i});
		}
	}
	llo ans=0;
	for(int i=0;i<n-2;i++){
		for(int j=0;j<m-2;j++){
			int aa,bb,cc,ee;
			aa=i+1;
			bb=j+1;
			if(dd[i][j+1]>-1){
				cc=dd[i][j+1]-1;
				if(cc<aa){
					continue;
				}

				int st=1;
				for(int k=bb;k<m-1;k++){
					ee=k;
					ans=(ans+check(aa,bb,cc,ee));
				}
				continue;
				for(auto jj:pre[i+1][j]){
					ee=jj.b-1;
					if(aa<=cc and bb<=ee){
						/*if(i==3 and j==2){
							cout<<aa<<","<<bb<<","<<cc<<","<<ee<<endl;
						}*/
						ans=ans+check(aa,bb,cc,ee);
						if(jj.b==re[i+1][j]){
							st=0;
						}
					}
				}
				if(re[i+1][j]!=-1){
					ee=re[i+1][j]-1;
					if(aa<=cc and bb<=ee){
						/*if(i==3 and j==2){
							cout<<aa<<","<<bb<<","<<cc<<","<<ee<<endl;
						}*/
						ans=ans+check(aa,bb,cc,ee);
					}
				}
			}
		}
	}
	//cout<<11<<endl;
	for(int i=n-1;i>1;i--){
		for(int j=0;j<m-2;j++){
			if(uu[i][j+1]>-1){
				int aa,bb,cc,ee;
				bb=j+1;
				cc=i-1;
				aa=uu[i][j+1]+1;
				for(int k=bb;k<m-1;k++){
					ee=k;
					ans=(ans+check(aa,bb,cc,ee));
				}
				continue;
				int st=1;
			/*	if(i==2 and j==0){
					cout<<aa<<","<<bb<<","<<cc<<","<<endl;
				}*/
				for(auto jj:pre[aa][bb-1]){
					ee=jj.b-1;
					if(aa<=cc and bb<=ee){
						/*if(i==2 and j==0){
							cout<<aa<<","<<bb<<","<<cc<<","<<ee<<endl;
						}*/
						ans=ans+check(aa,bb,cc,ee);
						if(jj.b==re[aa][cc-1]){
							st=0;
						}
					}
				}
				if(re[aa][bb-1]!=-1){
					ee=re[aa][bb-1]-1;
					if(aa<=cc and bb<=ee){
					/*	if(i==2 and j==0){
							cout<<aa<<","<<bb<<","<<cc<<","<<ee<<endl;
						}*/
						ans=ans+check(aa,bb,cc,ee);
					}
				}

			}
		}
	}
/*	for(int i=1;i<n-1;i++){
		for(int j=1;j<m-1;j++){
			for(int k=i;k<n-1;k++){
				for(int l=j;l<m-1;l++){

					if(check(i,j,k,l)==1){
						cout<<i<<":"<<j<<":"<<k<<":"<<l<<endl;
					}
					ans+=check(i,j,k,l);
				}
			}
		}
	}*/

	/*for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(re[i][j]>j+1){

			}
		}
	}


*/











	return ans;
}

Compilation message (stderr)

rect.cpp: In function 'llo count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:242:9: warning: variable 'st' set but not used [-Wunused-but-set-variable]
  242 |     int st=1;
      |         ^~
rect.cpp:285:9: warning: variable 'st' set but not used [-Wunused-but-set-variable]
  285 |     int st=1;
      |         ^~
#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...