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; }
pain and happy in the cruel world.