求助
查看原帖
求助
494598
him的自我修养楼主2024/5/4 16:48

题目大意是给定一个 k×kk \times k 的网格,最开始每个点都是四联通的,接下来的q次操作,每次操作都会使 (u1,v1)(u1,v1),(u2,v2)(u2,v2) 之间的边消失,求每次操作后(u1,v1)(u1,v1),(u2,v2)(u2,v2) 是否联通。k≤3000k \le 3000,强制在线。

#include <bits/stdc++.h>
using namespace std;
const int N=1500;
int fa[N*N];
int k,q,cnt;
int find(int x){
	return fa[x]==x?x:fa[x]=find(x);
}
int main(){
	cin >>k>>q;
	for(int i=0;i<=k*k;i++) fa[i]=i;
	while(q--){
		int a,b,c,d,x,y;cin >>a>>b>>c>>d;
		a=(a+cnt)%k+1;
		b=(b+cnt)%k+1;
		c=(c+cnt)%k+1;
		d=(d+cnt)%k+1;
		cout <<a<<" "<<b<<" "<<c<<" "<<d<<endl; 
		if(a==c){
			a--;
			d--;
		}else if(b==d){
			b--;
			c--;
		}
		x=(a-1)*(k-1)+b,y=(c-1)*(k-1)+d;
		if(a<1 || b<1 || a>=k || b>=k) x=0;
		if(c<1 || d<1 || c>=k || d>=k) y=0;
		if(find(x)==find(y)) cout <<"NO\n";
		else cout <<"YES\n",cnt++;
		fa[find(x)]=find(y);
	}
	return 0;
}
2024/5/4 16:48
加载中...