P1955 [NOI2015]程序自动分析

并查集+离散化,可惜我不会离散化。

然后我就学了学哈哈哈哈哈哈哈又会了点新东西。

用map做映射(虽然并不懂为什么用map)把所有的数都换到一个数组里去,然后手动去重(if(cnt[i]!=cnt[i-1]) Map[cnt[i]]=++sum;),放进map里去。

然后在做的时候就可以只用映射的数来并查集了。

inf[i].a=Map[inf[i].a];
inf[i].b=Map[inf[i].b];

  并查集倒是很简单

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;

int f[3000203],t,n,flag,tot,cnt[3000203],sum;
struct llo{
    int a;int b;int c;
} inf[3002002];
map <int,int> Map;


int find(int x){
    if(f[x]!=x)    f[x]=find(f[x]);
    return f[x];
}

int main(){
    scanf("%d",&t);
    while(t--){
        Map.clear();
        memset(cnt,0,sizeof(cnt));
        tot=0;
        //for(int i=1;i<=2*n;i++)
        //    f[i]=i;
        flag=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&inf[i].a,&inf[i].b,&inf[i].c);
            cnt[++tot]=inf[i].a;
            cnt[++tot]=inf[i].b;
        }
        sort(cnt+1,cnt+tot+1);
        Map[cnt[1]]=1,sum=1;
        for(int i=2;i<=tot;i++)
            if(cnt[i]!=cnt[i-1])    Map[cnt[i]]=++sum;
        for(int i=1;i<=sum;i++)    f[i]=i;
    //    sort(inf)
        for(int i=1;i<=n;i++)
            if(inf[i].c==1){
                inf[i].a=Map[inf[i].a];
                inf[i].b=Map[inf[i].b];
                int fx=find(inf[i].a);
                int fy=find(inf[i].b);
                if(fx!=fy)    f[fx]=fy;
            }
        for(int i=1;i<=n;i++)
            if(inf[i].c==0){
                inf[i].a=Map[inf[i].a];
                inf[i].b=Map[inf[i].b];
                int fx=find(inf[i].a);
                int fy=find(inf[i].b);
                if(fx==fy){
                    flag=-1;
                    break;
                }
            }
        if(flag==0)
            printf("YES
");
        else printf("NO
");
    }
    return 0;
}
View Code

但我一开始忘把Map和cnt数组清零了,导致一直80分。

原文地址:https://www.cnblogs.com/jindui/p/11194878.html