bzoj4195 [Noi2015]程序自动分析——并查集

Posted zinn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4195 [Noi2015]程序自动分析——并查集相关的知识,希望对你有一定的参考价值。

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195

突然在这道大水题上WA了半天...

思路很简单,离线处理询问,先把 = 的都加到并查集里,再暴力判断 != 的;

然而WA了许多遍...对离散化还是太不熟悉了...

1.fa[] 数组的预处理!平时写的手熟,上来就 for(i=1;i<=n;i++),完全忘了离散化后怎样怎样了啊!!

2. unique 的时候需要 -1!

3. lower_bound 时不要多 -1!

代码如下:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=2000005;
int T,n,fa[maxn],head[maxn],ct,d1[maxn],d2[maxn],tmp[maxn],tot,cnt,e[maxn];
struct N{
    int to,next;
    N(int t=0,int n=0):to(t),next(n) {}
}edge[maxn<<1];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void add(int x,int y){edge[++ct]=N(y,head[x]); head[x]=ct;}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n); cnt=0; tot=0;
        memset(head,0,sizeof head); ct=0;
//        for(int i=1;i<=n;i++)fa[i]=i;////
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&d1[i],&d2[i],&e[i]),tmp[++cnt]=d1[i],tmp[++cnt]=d2[i];
        sort(tmp+1,tmp+cnt+1);
        tot=unique(tmp+1,tmp+cnt+1)-tmp-1;//-1!!!
        for(int i=1;i<=tot;i++)fa[i]=i;//!!!
        for(int i=1,u,v;i<=n;i++)
        {
            u=lower_bound(tmp+1,tmp+tot+1,d1[i])-tmp;//不能 -tmp-1!
            v=lower_bound(tmp+1,tmp+tot+1,d2[i])-tmp;
            if(e[i]==1 && find(u)!=find(v)) fa[find(u)]=find(v);
            if(e[i]==0) add(u,v),add(v,u);
        }
        bool flag=0;
        for(int i=1;i<=tot;i++)
        {
            for(int j=head[i];j;j=edge[j].next)
                if(find(i)==find(edge[j].to)){flag=1; break;}
            if(flag)break;
        }
        if(flag)printf("NO
");
        else printf("YES
");
    }
    return 0;
}

 

以上是关于bzoj4195 [Noi2015]程序自动分析——并查集的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 4195 [Noi2015]程序自动分析

[BZOJ4195] [NOI2015] 程序自动分析 (并查集)

BZOJ4195 [Noi2015]程序自动分析

bzoj4195[Noi2015]程序自动分析

bzoj4195 [Noi2015]程序自动分析——并查集

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]