洛谷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 }