luoguP1955 [NOI2015]程序自动分析

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;
}

代码是比较丑陋的,,,

posted @ 2020-09-02 09:18  mybing  阅读(130)  评论(0编辑  收藏  举报