WUST OJ 1481: divide into groups(二分)

来源:互联网 发布:杀破狼js为什么下架了 编辑:程序博客网 时间:2024/06/06 07:44

1481: divide into groups

Time Limit: 1 Sec  Memory Limit: 128 MB  64bit IO Format: %lld
Submitted: 74  Accepted: 9
[Submit][Status][Web Board]

Description

一条路上站着许多人,没有两个人站在同一个坐标下。要将相互是朋友的人分到且必须分到同一组,不是朋友的两个人不允许分到同一组。
两个人至少满足以下一条规则就是朋友:
1.A,B一开始就是朋友
2.如果A和B是朋友,A和C是朋友,那么B和C也是朋友
3.如果A和B的距离不超过L,那么A和B自动成为朋友
现在wh想求出最小的L,使分组的组数为m。请帮助他求出最小的L。^_^

Input

第一行有三个数 n,m,d,n个游客,分为m组,一开始有d对朋友。0<=n<=10^5,1<=m<=n,0<=d<=n
接下来一行有n个数,表示每个游客的坐标pi  (0<=pi<=10^6)
接下来有d行,每行两个数a,b,表示坐标为a的人和坐标为b的人是朋友。 
所有的输入都是整数 ,多组测试

Output

如果存在最小的L,输出 L
否则输出 i love wh

Sample Input 

3 2 1
0 5 2
0 2
3 2
0
1 2 3

Sample Output

0
i love wh

Source

2015年暑期集训队选拔赛1

思路:二分枚举距离。合并用并查集。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAX=1e6+10;int p[MAX],a[MAX],d[MAX];int n,m;int pf(int x){return p[x]==x?x:p[x]=pf(p[x]);}int df(int x){return d[x]==x?x:d[x]=df(d[x]);}int check(int mid){    int ans=0;    for(int i=0;i<n;i++)d[a[i]]=p[a[i]];    for(int i=0;i+1<n;i++)    {        if(abs(a[i+1]-a[i])<=mid)d[df(a[i+1])]=df(a[i]);    }    for(int i=0;i<n;i++)if(d[a[i]]==a[i])ans++;    if(ans==m)return 0;    if(ans>m)return -1;    if(ans<m)return 1;}int main(){    int T,maxx,minx;    while(scanf("%d%d%d",&n,&m,&T)!=EOF)    {        maxx=1e6,minx=0;        memset(p,-1,sizeof p);        memset(d,-1,sizeof d);        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            p[a[i]]=a[i];            maxx=max(maxx,a[i]);            minx=min(minx,a[i]);        }        sort(a,a+n);        while(T--)        {            int x,y;            scanf("%d%d",&x,&y);            p[pf(x)]=pf(y);        }        int ans=0;        for(int i=0;i<n;i++)if(p[a[i]]==a[i])ans++;        if(ans==m){printf("0\n");continue;}        if(ans<m){puts("i love wh");continue;}        int l=1,r=maxx-minx,mid;        ans=-1;        while(r>=l)        {            mid=(l+r)/2;            int result=check(mid);            if(result==-1)l=mid+1;            else            {                if(result==0)ans=mid;                r=mid-1;            }        }        if(ans==-1)puts("i love wh");        else printf("%d\n",ans);    }    return 0;}