Submission #1047767

#TimeUsernameProblemLanguageResultExecution timeMemory
1047767vjudge1Rectangles (IOI19_rect)C++17
10 / 100
1 ms348 KiB
#include "rect.h"

#include <bits/stdc++.h>
using namespace std;

const int lim=3000;

using pii=pair<int,int>;

vector<vector<int>>grid;

int n,m,l,r,x,y,cnt;
bool vis[lim][lim];

void dfs(int i,int j){
	if(vis[i][j])return;
	vis[i][j]=1;
	cnt++;
	l=min(l,i);
	r=max(r,i);
	x=min(x,j);
	y=max(y,j);
	if(i&&!grid[i-1][j])dfs(i-1,j);
	if(j&&!grid[i][j-1])dfs(i,j-1);
	if(i+1<n&&!grid[i+1][j])dfs(i+1,j);
	if(j+1<m&&!grid[i][j+1])dfs(i,j+1);
}

long long count_rectangles(std::vector<std::vector<int> > a) {
	grid=a;
	n=a.size();
	m=a[0].size();
	if(n<3)return 0;
	if(n==3){
		vector<int>st;
		long int ans=0;
		for(int i=0;i<m;i++){
			if(1<st.size())
				for(int j=int(st.size())-2;0<=j;j--){
					if(a[1][st[j+1]]<a[1][i]){
						ans++;
					}else{
						break;
					}
				}
			while(st.size()&&a[1][st.back()]<a[1][i]){
				st.pop_back();
			}
			if(a[0][i]<=a[1][i]||a[2][i]<=a[1][i]){
				st.clear();
			}
			st.push_back(i);
		}
		return ans;
	}else{
		int ans=0;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(a[i][j]==0&&!vis[i][j]){
					l=x=INT_MAX;
					r=y=0;
					cnt=0;
					dfs(i,j);
					if(cnt==(r-l+1)*(y-x+1)){
						ans++;
					}
				}
			}
		}
		return ans;
	}
	return -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...