BZOJ4423: [AMPPZ2013]Bytehattan

来源:互联网 发布:ps下载mac免费版下载 编辑:程序博客网 时间:2024/06/05 18:38

BZOJ4423: [AMPPZ2013]Bytehattan

对偶图·并查集

题解:

http://www.cnblogs.com/lcf-2000/p/6217985.html

  删除一条边可以看做把两个空块连通。当删除一条边时这条边紧邻的两个空块已经连通了,那么删除这条边会导致这条边的两个顶点不连通。

  仔细想想觉得非常有道理。当删除一条边时发现这条边紧邻的两个空块已经连通了,那么删除这条边后会出现一个空块连成的环,于是就把里面的点和外面的点给隔开了。

  之后的事就非常简单了。将空块抠出来,然后并查集维护联通性即可。

Code:

#include <iostream>#include <cstring>#include <cstdio>#define D(x) cout<<#x<<" = "<<x<<"  "#define E cout<<endlusing namespace std;const int N = 1500*1500+5;int n,k,id[1505][1505];struct MergeSet{    int pa[N];     void init(int sz){ for(int i=1;i<=sz;i++)pa[i]=i; }    int find(int x){ if(pa[x]!=x)pa[x]=find(pa[x]); return pa[x]; }} ms;void init(){    for(int i=1;i<=n-1;i++)        for(int j=1;j<=n-1;j++)            id[i][j]=(i-1)*(n-1)+j;}void getblock(int a,int b,char op,int &x,int &y){    if(op=='N'){ x=id[a-1][b]; y=id[a][b]; }    else{ x=id[a][b-1]; y=id[a][b]; }}int main(){    freopen("a.in","r",stdin);    int a1,a2,a,b1,b2,b,x,y,ans=1; char op[5];    scanf("%d%d",&n,&k);    init(); ms.init(n*n);    for(int i=1;i<=k;i++){        scanf("%d%d%s",&a1,&b1,op);        scanf("%d%d%s",&a2,&b2,op+1);        if(ans)a=a1,b=b1,op[0]=op[0];        else a=a2,b=b2,op[0]=op[1];//      D(a); D(b); D(op[0]); E;        getblock(a,b,op[0],x,y);//      D(x); D(y); E;        x=ms.find(x); y=ms.find(y);        if(x==y)ans=false;        else ans=true, ms.pa[x]=y;        printf("%s\n",ans?"TAK":"NIE");    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 猫被马蜂蛰了怎么办 被地雷蜂蛰了怎么办 被葫芦蜂蛰了怎么办 嘴巴被蜜蜂蛰了怎么办 被蜜蜂蜇伤了怎么办 婴儿被蜜蜂蜇了怎么办 婴儿被黄蜂蛰了怎么办 蜜蜂在石头缝里怎么办 中蜂蜂王不产卵怎么办 冲电器充电变慢怎么办 摇号审核通过后怎么办 京东白条开不了怎么办 得了病心里压力大怎么办 电视家看直播卡怎么办 日上提货单丢了怎么办 想直飞香港l签怎么办 u盘识别不出来怎么办 卫生间下水道有小飞虫怎么办 橙光一直闪退怎么办 若白回来了,长安怎么办 没了你以后我该怎么办 玩cf的时候闪退怎么办 婴儿嗓子哭哑了怎么办 宝宝嗓子哭哑了怎么办 小孩嗓子哭哑了怎么办 孩子嗓子哭哑了怎么办 月经来了晚上漏怎么办 在学校月经漏了怎么办 月经来了血下不来怎么办 想让月经快点来怎么办 孩子来月经不规律怎么办 一个月来2次月经怎么办 14岁月经不规律怎么办 不是经期内裤有黑色血怎么办 月经量多血块多怎么办 网友见面没上她怎么办 拔完智齿老流血怎么办 学车教练不教怎么办 想开奶茶店没有经验怎么办 宝宝吃多了不消化怎么办 吃了糖精和鸡蛋怎么办