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;
}
原文地址:https://www.cnblogs.com/ziyi--caolu/p/3476772.html