luoguP1955 [NOI2015]程序自动分析
哇,这道题是把我坑惨了。。。
首先是快读打错了,>=0写成>0,那还玩屁啊
然后后来发现是思想上也有问题,因为开始想着是按照所给的顺序依次解决就好了,但是没有考虑到,如果a!=b,b!=c,但是并不代表a!=c啊,这就非常好玩了。
#include<bits/stdc++.h> using namespace std; int x; char ch; inline int read() { x=0;ch=getchar(); while(ch<'0'||ch>'9'){ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x; } int T,mid,n,m,m2,a[1000010],b[1000010],c[1000010],d[2000010],e[2000010],l,r; int fa[2000010],t[2000010],tot=0; int real(int p) { l=1;r=m; while(l+1<r) { mid=(l+r)>>1; if(e[mid]<p)l=mid; else r=mid; } if(e[l]==p)return l; else return r; } int findfa(int p) { if(fa[p]==p)return p; else return fa[p]=findfa(fa[p]); } bool merge(int aa,int bb) { aa=findfa(aa); bb=findfa(bb); if(t[aa]&&t[bb]&&t[aa]!=t[bb])return true; if(t[bb])swap(aa,bb); fa[bb]=aa; return false; } bool fenkai(int aa,int bb) { aa=findfa(aa); bb=findfa(bb); if(t[aa]&&t[bb]&&t[aa]!=t[bb])return false; if(t[aa]&&t[bb]&&t[aa]==t[bb])return true; if(aa==bb)return true; if(t[bb])swap(aa,bb); if(!t[aa])t[aa]=++tot; t[bb]=++tot; return false; } int main() { //freopen("xf.in","r",stdin); //freopen("xf.out","w",stdout); scanf("%d",&T); while(T--) { m=0;tot=0; scanf("%d",&n); memset(t,0,sizeof(t)); for(int i=1;i<=n;i++) { a[i]=read();b[i]=read();c[i]=read(); d[i*2-1]=a[i];d[i*2]=b[i]; } n*=2; sort(d+1,d+n+1); n/=2; for(int i=1;i<=n*2;i++) { if(d[i]!=d[i-1])e[++m]=d[i]; } for(int i=1;i<=n;i++) { a[i]=real(a[i]);b[i]=real(b[i]); } for(int i=1;i<=m;i++)fa[i]=i; int iy; for(iy=1;iy<=n;iy++) { if(c[iy]) { if(merge(a[iy],b[iy])) { printf("NO\n"); break; } } } for(iy=1;iy<=n;iy++) { if(!c[iy]) { if(fenkai(a[iy],b[iy])) { printf("NO\n"); break; } } } if(iy>n)printf("YES\n"); } return 0; }
代码是比较丑陋的,,,