题目描述:
题解:
平面图转对偶图+并查集维护。
其实操作就是把两个格子捏在一起,这个并查集就可以搞。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1550; template<typename T> inline void read(T&x) { T f = 1,c = 0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} x = f*c; } int n,m,ff[N*N],S,k; int findff(int u){return u==ff[u]?u:ff[u]=findff(ff[u]);} int _id(int x,int y) { if(!x||!y||x==n||y==n)return S; return x+(y-1)*(n-1); } struct op { char s[2]; int x,y; void rd() { read(x),read(y); scanf("%s",s); } }p[2],o; int merge(int u,int v) { u = findff(u),v = findff(v); if(u!=v){ff[u]=v;return 0;} return 1; } int main() { read(n),read(m); S=(n-1)*(n-1)+1; for(int i=1;i<=(n-1)*(n-1)+1;i++) ff[i] = i; for(int i=1;i<=m;i++) { p[0].rd(),p[1].rd(); o = p[k]; int u,v,x=o.x,y=o.y; if(o.s[0]=='N')u=_id(x-1,y),v=_id(x,y); else u=_id(x,y-1),v=_id(x,y); k = merge(u,v); puts(k?"NIE":"TAK"); } return 0; }