bzoj4423: [AMPPZ2013]Bytehattan

昨天A狼抓兔子的时候无意被tyb队长看到了……

然后就是一个早上的血泪史,终于AC了,还好我没精A(tyb:这就是你烦我三次的理由)

一烦tyb,ta告诉我,删边就在对偶图连,然后我就用两小时做了一个基本AC的解。。。然后想啊想代码200+

二烦tyb,我满怀信心的拿着图,指指点点,ta说:是啊!然后嘞?我说:???哦!我傻逼了,询问联通的两个点是肯定是相连的,怒减100+。。。

三烦tyb,正当我跪在电脑前想如何判断环时,tyb和善??的走过来,告诉我如果两个点如果是联通的,然后现在再连一次,那肯定是环啦!

不解释代码和做法了了

#include<cstdio>
#include<cstring>
using namespace std;
int fa[5100000];
int findfa(int x)
{
    if(x==fa[x])return x;
    fa[x]=findfa(fa[x]);return fa[x];
}
int n,st,ed;
int point(int x,int y)
{
    return (x-1)*(n-1)+y;
} 
bool linkud(int x,int y)
{
    int p1,p2;
    if(x==2)
    {
        p1=st;
        p2=point(x,y);
    }
    else if(x==n-1)
    {
        p1=point(x-1,y);
        p2=ed;
    }
    else
    {
        p1=point(x-1,y);
        p2=point(x,y);
    }
    int f1=findfa(p1),f2=findfa(p2);
    if(f1==f2)return false;
    else {fa[f1]=f2;return true;}
}
bool linklr(int x,int y)
{
    int p1,p2;
    if(y==2)
    {
        p1=point(x,y);
        p2=(x*2>=n)?st:ed;
    }
    else if(y==n-1)
    {
        p1=point(x,y-1);
        p2=(x*2>=n)?st:ed;
    }
    else
    {
        p1=point(x,y-1);
        p2=point(x,y);
    }
    int f1=findfa(p1),f2=findfa(p2);
    if(f1==f2)return false;
    else {fa[f1]=f2;return true;}
}
char ss[2][5];
int xx[2],yy[2];
int main()
{
    int T;
    scanf("%d%d",&n,&T);n+=2;
    st=(n-1)*(n-1)+1;
    ed=(n-1)*(n-1)+2;
    for(int i=1;i<=ed;i++)fa[i]=i;
    for(int i=1;i<=n;i++)
    {
        fa[point(1,i)]=0;
        fa[point(n,i)]=0;
        fa[point(i,1)]=0;
        fa[point(i,n)]=0;
    }
    
    int x,y;char cc;
    bool bk=true;
    while(T--)
    {
        scanf("%d%d%s",&xx[0],&yy[0],ss[0]+1);
        scanf("%d%d%s",&xx[1],&yy[1],ss[1]+1);
        if(bk==true){x=xx[0]+1;y=yy[0]+1;cc=ss[0][1];}
        else        {x=xx[1]+1;y=yy[1]+1;cc=ss[1][1];}
    
        if(cc=='N')
        {
            bk=linkud(x,y);
            if(bk==true)printf("TAK\n");
            else         printf("NIE\n");
        }
        else 
        {
            bk=linklr(x,y);
            if(bk==true)printf("TAK\n");
            else         printf("NIE\n");
        }
    }
    return 0;
}

 

posted @ 2017-10-12 12:35  AKCqhzdy  阅读(207)  评论(0编辑  收藏  举报