zoukankan      html  css  js  c++  java
  • 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
    ");
                        break;
                    }
                }
            }
            for(iy=1;iy<=n;iy++)
            {
                if(!c[iy])
                {
                    if(fenkai(a[iy],b[iy]))
                    {
                        printf("NO
    ");
                        break;
                    }
                }
            }
            if(iy>n)printf("YES
    ");
        }
        return 0;
    }

    代码是比较丑陋的,,,

  • 相关阅读:
    强制开启Android webview debug模式
    JavaScript DOM操作案例自定义属性的设置跟获取
    JavaScript innerText跟innerHTML的区别
    JavaScript DOM操作案例封装innerText跟textContent函数(浏览器兼容)
    JavaScript其他获取元素的方式
    JavaScript DOM操作案例根据类样式的名字获取元素
    JavaScript DOM操作案例根据name属性获取元素
    Java throws 使用
    理解 Android Build 系统
    理解Android编译命令
  • 原文地址:https://www.cnblogs.com/mybing/p/13599980.html
Copyright © 2011-2022 走看看