题解:P10665 [AMPPZ2013] Bytehattan
fish_love_cat · · 题解
咦为啥我啥都不会。加学。
网格是平面图,删边相当于在对偶图上加边。
如果对偶图上加这条边以前两个点已经连通,加边后两个点一定会被完全切断,于是不连通。
所以我们只需要维护一个只加边的对偶图的连通性就好了。
dsu 即可。
#include<bits/stdc++.h>
#define int long long
#define N (1501*1501)
using namespace std;
int n;
int id(int x,int y){
return (x-1)*(n+1)+y;
}
int fa[N+5];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
bool solve(int u,int v,char c){
int x=id(u+1,v+1);
int y;
if(c=='N')y=id(u,v+1);
if(c=='E')y=id(u+1,v);
if(find(x)==find(y))return 0;
fa[find(x)]=find(y);
return 1;
}
signed main(){
int k;
cin>>n>>k;
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++)
fa[id(i,j)]=id(i,j);
bool ans=1;
while(k--){
if(ans){
int u,v;
char c;
cin>>u>>v>>c;
ans=solve(u,v,c);
cin>>u>>v>>c;
}else{
int u,v;
char c;
cin>>u>>v>>c;
cin>>u>>v>>c;
ans=solve(u,v,c);
}
if(ans)cout<<"TAK\n";
else cout<<"NIE\n";
}
return 0;
}
// 并不是以战士的身份,当然更不是以勇者或英雄的身份。
// 他仅以一名诡辩家的身份参战,然后获得了胜利。