zoukankan      html  css  js  c++  java
  • 程序自动分析

    题目链接

    题意:给你n对x,y,你知道xy是否相等,问能否构成合法序列。n<=1e6,x,y<=1e9.

    思路:很明显是一个并查集的题目,当xy相等时为一个集合。需要注意的是因为xy很大所以要离散化,

    我用的是map离散化,刚开始用迭代器t了!!!

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    #include<cmath>
    #define ll long long
    using namespace std;
    map<int,int> mp;
    struct point 
    {
        int x;
        int y;
        int z;
    }a[1000010];
    int fa[2000010];
    
    int get(int k)
    { 
        return fa[k]==k?k:fa[k]=get(fa[k]); 
    }
    void merge(int x,int y)
    {
        fa[get(x)]=get(y); 
    }
    bool cmp(point a,point b)
    {
        return a.z>b.z;
    }
    int main()
    {
        int t;
        while(~scanf("%d",&t))
        {
            while(t--)
            {
                int n;
                mp.clear();
                scanf("%d",&n);
                int m=1;
                for(int i=0;i<n;i++)
                {
                    scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
                    if(mp[a[i].x]==0)
                    {
                        mp[a[i].x]=m;
                        a[i].x=m;
                        m++;
                    }
                    else
                    {
                        a[i].x=mp[a[i].x];
                    }
                    if(mp[a[i].y]==0)
                    {
                        mp[a[i].y]=m;
                        a[i].y=m;
                        m++;
                    }
                    else
                    {
                        a[i].y=mp[a[i].y];
                    }
                //    printf("x:%d y:%d
    ",a[i].x,a[i].y);
                }
            /*    int m=1;
                for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
                {
                    mp[it->first]=m;
                    m++;
                }*/
                for(int i=1;i<=m;i++)
                {
                    fa[i]=i;
                }
                int flag=0;
                sort(a,a+n,cmp);
                for(int i=0;i<n;i++)
                {
                    int u=get(a[i].x);
                    int v=get(a[i].y);
                //    printf("x:%d fa:%d
    ",a[i].x,u);
                //    printf("y:%d fa:%d
    ",a[i].y,v);
                    if(a[i].z==1)
                    {
                        merge(u,v);
                    }
                    else
                    {
                        if(u==v)
                        {
                            flag=1;
                            break;
                        }
                    }
                }
                if(flag)
                printf("NO
    ");
                else
                printf("YES
    ");
            }
            
        }
    }
  • 相关阅读:
    win7+Apache 设置域名指向本地文件夹
    JavaScript 函数式编程
    JS防抖动
    13 个最佳 JavaScript 数据网格库
    js笔试-接收get请求参数
    这10道javascript笔试题你都会么
    60行JavaScript代码俄罗斯方块
    先少谈点人工智能好吗?
    gulp+webpack构建配置
    Gulp和webpack的区别,是一种工具吗?
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11338117.html
Copyright © 2011-2022 走看看