• 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分。

  • 相关阅读:
    java泛型
    java集合
    java面向对象
    java常用类
    二分查找
    递归
    选择排序+冒泡排序
    threejs入门简单例子
    css表格合并边框以及单元格宽度计算方式
    Spring Boot 有哪些优点?
  • 原文地址:https://www.cnblogs.com/jindui/p/11194878.html
Copyright © 2020-2023  润新知