求调 WA on #2
查看原帖
求调 WA on #2
284916
2019yyy楼主2024/8/12 08:03
#include<bits/stdc++.h>
using namespace std;
int a[21][21];
int dirx[]={0,1,-1,0,0};
int diry[]={0,0,0,1,-1};
int fa[1100000],f[1100000];
map<pair<int,int>,int> m;
int getfa(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=getfa(fa[x]);
}
int del(int x){
	int ans=0;
	for(int i=1;i<=19;i++){
		for(int j=1;j<=19;j++){
			if(fa[m[make_pair(i,j)]]==x){
				ans++;
				a[i][j]=0;
				f[m[make_pair(i,j)]]=0;
				fa[m[make_pair(i,j)]]=m[make_pair(i,j)];
				m[make_pair(i,j)]=0;
				for(int k=1;k<=4;k++){
					int dx=i+dirx[k];
					int dy=j+diry[k];
					if(dx<=0 or dx>=20 or dy<=0 or dy>=20){
						continue;
					}
					f[getfa(m[make_pair(dx,dy)])]++;
				}
			}
		}
	}
	return ans;
}
int main(){
	int mm;
	cin>>mm;
	for(int i=1;i<=mm;i++){
		fa[i]=i;
	}
	for(int i=1;i<=mm;i++){
		int x,y,ans[3]={};
		cin>>x>>y;
		m[make_pair(x,y)]=i;
		int opt=(i&1);
		opt++;
		a[x][y]=opt;
		f[i]=4;
		for(int j=1;j<=4;j++){
			int dx=x+dirx[j];
			int dy=y+diry[j];
			if(dx<=0 or dx>=20 or dy<=0 or dy>=20){
				f[getfa(i)]--;
				continue;
			}
			if(a[dx][dy]==0){
				continue;
			}
			if(a[dx][dy]!=opt){
				int temp=(--f[getfa(m[make_pair(dx,dy)])]);
				f[getfa(i)]--;
				if(temp==0){
					int tt=a[dx][dy];
					//cout<<" "<<a[dx][dy]<<" "<<getfa(m[make_pair(dx,dy)])<<'\n';
					ans[tt]+=del(getfa(m[make_pair(dx,dy)]));
				}
			}else{
				int fax=getfa(i);
				int fay=getfa(m[make_pair(dx,dy)]);
				f[fax]--;
				if(fax==fay){
					continue;
				}
				f[fay]+=f[fax]-1;
				fa[fax]=fay;
			}
		}
		if(f[getfa(i)]==0){
			ans[opt]+=del(getfa(i));
		}
		cout<<ans[2]<<" "<<ans[1]<<'\n';
	}
	return 0;
} 

2024/8/12 08:03
加载中...