[BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)

建出对偶图,删除一条边时将两边的格子连边。一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 using namespace std;
 5 
 6 const int N=1510;
 7 char op[3];
 8 int n,Q,ans,a,b,x,y,fa[N*N];
 9 
10 int find(int x){ return fa[x]==x ? x : fa[x]=find(fa[x]); }
11 int F(int x,int y){ return (!x || !y || x==n || y==n) ? 0 : (x-1)*n+y; }
12 
13 int main(){
14     freopen("bzoj4423.in","r",stdin);
15     freopen("bzoj4423.out","w",stdout);
16     scanf("%d%d",&n,&Q);
17     rep(i,1,n*n) fa[i]=i;
18     while (Q--){
19         if (!ans) scanf("%d%d%s%*d%*d%*s",&a,&b,op);
20             else scanf("%*d%*d%*s%d%d%s",&a,&b,op);
21         if (op[0]=='N') x=F(a,b),y=F(a-1,b); else x=F(a,b),y=F(a,b-1);
22         if (find(x)==find(y)) ans=1,puts("NIE"); else ans=0,puts("TAK");
23         x=find(x); y=find(y); fa[x]=y;
24     }
25     return 0;
26 }

 

posted @ 2018-12-02 16:57  HocRiser  阅读(185)  评论(0编辑  收藏  举报