洛谷P2504 [HAOI2006]聪明的猴子

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5050;
 4 const int maxm=5000005;
 5 int n,m,k,ans;
 6 double Max;
 7 int monkey[maxn];
 8 typedef pair<int,int> P;
 9 P point[maxn];
10 #define Dis(x,y) (sqrt((x.first-y.first)*(x.first-y.first)+(x.second-y.second)*(x.second-y.second)))
11 struct node{
12     int cnt,fa;
13 }f[maxn];
14 int find(int x){return f[x].fa==x?x:f[x].fa=find(f[x].fa);}
15 void Union(int x,int y)
16 {
17     x=find(x),y=find(y);if(x==y) return;
18     if(f[x].cnt<=f[y].cnt) {f[x].fa=y;f[y].cnt+=f[x].cnt;}
19     else {f[y].fa=x;f[x].cnt+=f[y].cnt;} 
20 }
21 struct edge{
22     int x,y;double dis;
23 }E[maxm];
24 inline bool cmp(const edge &a,const edge &b) {return a.dis<b.dis;}
25 int main()
26 {
27     scanf("%d",&k);
28     for(int i=1;i<=k;i++) scanf("%d",&monkey[i]);
29     sort(monkey+1,monkey+1+k);
30     scanf("%d",&n);
31     for(int i=1;i<=n;i++) scanf("%d%d",&point[i].first,&point[i].second);
32     for(int i=1;i<=n;i++)
33         for(int j=1;j<=i;j++)
34         {
35             if(i==j) continue;
36             E[++m].x=i;E[m].y=j;E[m].dis=Dis(point[i],point[j]);
37         }
38     for(int i=1;i<=n;i++) f[i].fa=i,f[i].cnt=1;
39     sort(E+1,E+1+m,cmp);
40     for(int i=1;i<=m;i++)
41     {
42         if(f[find(1)].cnt==n) break;
43         if(find(E[i].x)!=find(E[i].y)) Union(E[i].x,E[i].y),Max=max(Max,E[i].dis);
44     }
45     for(int i=1;i<=k;i++) if(monkey[i]>=Max) ++ans;
46     printf("%d",ans);
47     return 0;
48 }

 

posted @ 2019-01-13 10:28  宇興  阅读(196)  评论(0编辑  收藏  举报