• Luogu P1955 [NOI2015]程序自动分析


    又一次做了这道题,感慨万千。

    记得寒假时,被cmd2001点起来讲这道题,胡言乱语。。受尽鄙视(现在也是好吗)。。后来下课想A掉,可是3天下来总是错。。。后来抄了分题解就咕咕了。。。

    今天老师留了这道题,想起往事不堪回首。。于是决定做一下。。结果一次A了 (???)

    先把所有相等条件的合并,然后拿不等条件一个个试,如果都没问题,就YES,若和之前合并的矛盾,就NO

    // luogu-judger-enable-o2
    #include<cstdio>
    #include<iostream>
    #include<map>
    #define pc(x) putchar(x)
    #define R register int
    #define getchar() *S++
    char RR[100000000],*S=RR;
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    int n,m,t,cnt,num;
    int fa[200010],u[100010],v[100010];
    int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
    inline void merge(int u,int v) {
        u=getf(u),v=getf(v); fa[u]=v;
    }
    signed main() {
        fread(RR,sizeof(RR),1,stdin);
        t=g();
        while(t--) { cnt=0,num=0; register bool flg=false;
            map<int,int> mp;
            n=g(); for(R i=1;i<=2*n;++i) fa[i]=i;
            for(R i=1;i<=n;++i){
                R uu=g(),vv=g(),k=g();
                if(mp.find(uu)==mp.end()) uu=mp[uu]=++num; else uu=mp[uu];
                if(mp.find(vv)==mp.end()) vv=mp[vv]=++num; else vv=mp[vv];
                if(k) merge(uu,vv); 
                else u[++cnt]=uu,v[cnt]=vv;
            }
            for(R i=1;i<=cnt;++i) if(getf(u[i])==getf(v[i])) {flg=true; break;}
            flg?(pc('N'),pc('O')):(pc('Y'),pc('E'),pc('S')); pc('
    ');
        }
    }

    2019.04.16

  • 相关阅读:
    Ubuntu12.04 亮度调节和保存
    算法
    Python一些常见问题的解决方法
    数据结构
    C# 运行时编译代码并执行 【转】
    C# 动态添加属性 非原创 有修改
    30天学通Visual C++项目案例开发 下載
    .NET常用Request获取信息
    获取一个目录下所有的文件,包括子目录的
    C++入门到精通_全集下载
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10719179.html
Copyright © 2020-2023  润新知