bzoj4423 [AMPPZ2013]Bytehattan

题目描述:

bz

题解:

平面图转对偶图+并查集维护。

其实操作就是把两个格子捏在一起,这个并查集就可以搞。

代码:

#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;
}
View Code
原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10820523.html