题目大意是给定一个 k×k 的网格,最开始每个点都是四联通的,接下来的q次操作,每次操作都会使 (u1,v1),(u2,v2) 之间的边消失,求每次操作后(u1,v1),(u2,v2) 是否联通。k≤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;
}