• BZOJ 4423: [AMPPZ2013]Bytehattan


    Sol

    对偶图+并查集.

    思路非常好,将网格图转化成对偶图,在原图中删掉一条边,相当于在对偶图中连上一条边(其实就是网格的格点相互连边),每次加边用并查集维护就可以了.

    哦对,还要注意边界就是网格外面看做是一个点就可以了.

    PS:好久前的代码.

    Code

    /**************************************************************
        Problem: 4423
        User: BeiYu
        Language: C++
        Result: Accepted
        Time:1300 ms
        Memory:18500 kb
    ****************************************************************/
     
    #include<cstdio>
    #define N 1505
    struct Union_Find{
        int f[N*N];
        Union_Find(){for(int i=0;i<N*N;i++) f[i]=i;}
        int Find(int x){return f[x]==x?x:f[x]=Find(f[x]);}
        void Union(int u,int v){int f1=Find(u),f2=Find(v);f[f1]=f2;}
    }UF;
    int cnt,n,k,idx[N][N];
    inline int in(int x=0,char ch=getchar()){while(ch>'9'||ch<'0') ch=getchar();
        while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;}
    int main(){
        n=in(),k=in();
        for(int i=1;i<n;i++) for(int j=1;j<n;j++) idx[i][j]=++cnt;
        int u,v,ans=1;char opt[5];
        while(k--){
            if(ans) u=in(),v=in(),scanf("%s%*d%*d%*s",opt);
            else scanf("%*d%*d%*s"),u=in(),v=in(),scanf("%s",opt);
            if(opt[0]=='N')
                if(ans=UF.Find(idx[u][v])!=UF.Find(idx[u-1][v])) UF.Union(idx[u][v],idx[u-1][v]);
            if(opt[0]=='E')
                if(ans=UF.Find(idx[u][v])!=UF.Find(idx[u][v-1])) UF.Union(idx[u][v],idx[u][v-1]);
            puts(ans?"TAK":"NIE");
        }return 0;
    }
    

      

  • 相关阅读:
    2016第13周四
    2016第13周周三
    2016第13周二
    2016第13周一
    2016第12周日
    2016第11周五
    2016第11周四
    前端的自我成长
    Java单例模式和volatile关键字
    大约 Apple Metal API 一些想法
  • 原文地址:https://www.cnblogs.com/beiyuoi/p/5787624.html
Copyright © 2020-2023  润新知