zoukankan      html  css  js  c++  java
  • hdu1856

    题意:就是询问下,一个并查集里面结点数最多的....并输出来,大致是这个意思吧,当然可以离散化下,水题.....

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define M 100005
    struct
    {
        int father;
        int sum;
    } s[4*M];
    int t[2*M][2],a[2*M];
    int find(int x)
    {
        int i=x,root;
        while(x!=s[x].father)
            x=s[x].father;
        root=x;
        x=i;
        while(x!=s[x].father)
        {
            i=s[x].father;
            s[root].sum+=s[x].sum;
            s[x].sum=0;
            s[x].father=root;
            x=i;
        }
        return root;
    }
    void liantong(int x,int y)
    {
        s[x].sum+=s[y].sum;
        s[y].father=x;
        s[y].sum=0;
    }
    int erfen(int ll,int rr,int num)
    {
        while(ll<=rr)
        {
            int mid=(ll+rr)/2;
            if(a[mid]>num)
            rr=mid-1;
            else
            ll=mid+1;
        }
        //printf("%d %d
    ",a[rr],num);
        return rr;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)>0)
        {
            int ans=0;
            int cnt=0;
            for(int i=0; i<=3*100005; i++)
            {
                s[i].father=i;
                s[i].sum=1;
            }
            //scanf("")
            for(int i=0; i<n; i++)
            {
                scanf("%d%d",&t[i][0],&t[i][1]);
                a[cnt++]=t[i][0];
                a[cnt++]=t[i][1];
            }
            sort(a,a+cnt);
            int cnt1=1;
            for(int i=1; i<cnt; i++)
                if(a[i]!=a[i-1])   a[cnt1++]=a[i];
            for(int i=cnt1-1; i>0; i--)
                if(a[i]!=a[i-1]+1)   a[cnt1++]=a[i-1]+1;
            sort(a,a+cnt1);
            for(int i=0; i<n; i++)
            {
                int left=0,right=cnt1-1;
                int x=erfen(left,right,t[i][0]);
                int y=erfen(left,right,t[i][1]);
                x=find(x);
                y=find(y);
                if(x!=y)
                    liantong(x,y);
            }
            for(int i=0;i<=2*100005;i++)
            find(i);
            int ans1=0;
            for(int i=0;i<=2*100005;i++)
            if(ans1<s[i].sum)
            ans1=s[i].sum;
            printf("%d
    ",ans1);
        }
        return 0;
    }
    
  • 相关阅读:
    RESTful API 设计指南
    Memcached的使用
    Flask快速入门
    5.数据结构--递归
    4.数据结构--链表
    3.数据结构--队列
    2.数据结构--栈
    lnmp1.5安装fileinfo扩展
    JavaScript.内置对象
    JavaScript.之引用类型
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3476772.html
Copyright © 2011-2022 走看看