Submission #1153280

#TimeUsernameProblemLanguageResultExecution timeMemory
1153280owoovoRectangles (IOI19_rect)C++20
13 / 100
1453 ms434412 KiB
#include "rect.h"
#include<bits/stdc++.h>
#define ll long long 
#define F first 
#define S second 
using namespace std;
pair<int,int> dsu[2510][2510];
int sz[2510][2510],nl[2510][2510],xr[2510][2510],nu[2510][2510],xd[2510][2510],use[2510][2510],mp[2510][2510],n,m;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
ll ans;
pair<int,int> f(pair<int,int> p){
	auto [x,y]=p;
	if(dsu[x][y]==p){
		return p;
	}else{
		dsu[x][y]=f(dsu[x][y]);
	}
	return dsu[x][y];
}
bool onion(pair<int,int> p1,pair<int,int> p2){
	p1=f(p1);
	p2=f(p2);
	if(p1==p2)return 0;
	auto [x1,y1]=p1;
	auto [x2,y2]=p2;
	if(sz[x1][y1]>sz[x2][y2])swap(p1,p2),swap(x1,x2),swap(y1,y2);
	dsu[x1][y1]=dsu[x2][y2];
	sz[x2][y2]+=sz[x1][y1];
	nl[x2][y2]=min(nl[x1][y1],nl[x2][y2]);
	xr[x2][y2]=max(xr[x1][y1],xr[x2][y2]);
	nu[x2][y2]=min(nu[x1][y1],nu[x2][y2]);
	xd[x2][y2]=max(xd[x1][y1],xd[x2][y2]);
	return 1;
}
ll count_rectangles(vector<vector<int>> a) {
	n=a.size();
	m=a[0].size();
	ans=0;
	vector<pair<int,pair<int,int>>> pt;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			mp[i][j]=a[i-1][j-1];
			dsu[i][j]={i,j};
			sz[i][j]=1;
			nl[i][j]=j;
			xr[i][j]=j;
			nu[i][j]=i;
			xd[i][j]=i;
			pt.push_back({mp[i][j],{i,j}});
		}
	}
	sort(pt.begin(),pt.end());
	pt.push_back({-1,{0,0}});
	vector<pair<int,int>> god;
	for(int i=0;i<n*m;i++){
		if(pt[i].F!=pt[i+1].F){
			for(auto &x:god){
				x=f(x);
			}
			sort(god.begin(),god.end());
			god.erase(unique(god.begin(),god.end()),god.end());
			for(auto x:god){
				auto [u,v]=x;
				if(sz[u][v]==(xr[u][v]-nl[u][v]+1)*(xd[u][v]-nu[u][v]+1)
				&&xr[u][v]!=m&&nl[u][v]!=1&&xd[u][v]!=n&&nu[u][v]!=1)ans++;
			}
			god.clear();
		}
		auto [x,y]=pt[i].S;
		god.push_back({x,y});
		use[x][y]=1;
		for(int c=0;c<4;c++){
			int nx=x+dx[c],ny=y+dy[c];
			if(use[nx][ny]){
				onion({x,y},{nx,ny});
			}
		}
	}

	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...