bzoj2429

裸mst

 1 #include<bits/stdc++.h>
 2 #define lowbit(a) ((a)&(-(a)))
 3 #define clr(a,x) memset(a,x,sizeof(a))
 4 #define rep(i,l,r) for(int i=l;i<(r);i++)
 5 typedef long long ll;
 6 using namespace std;
 7 int read()
 8 {
 9     char c=getchar();
10     int ans=0,f=1;
11     while(!isdigit(c)){
12         if(c==‘-‘) f=-1;
13         c=getchar();
14     }
15     while(isdigit(c)){
16         ans=ans*10+c-‘0‘;
17         c=getchar();
18     }
19     return ans*f;
20 }
21 struct edge{
22     int u,v;
23     double d;
24     inline bool operator<(const edge&A)const{
25         return d<A.d;
26     }
27 };
28 const int maxn=1009,inf=0x7fffffff;
29 int n,m,cnt=0,ans=0,x[maxn],y[maxn],a[maxn],f[maxn];
30 double mn=-1e30;
31 edge e[maxn*maxn];
32 void addedge(int u,int v,double d){
33     edge ed;
34     ed.u=u;ed.v=v;ed.d=d;
35     e[cnt++]=ed;
36 }
37 int find(int x){
38     return f[x]==x?f[x]:f[x]=find(f[x]);
39 }
40 int main()
41 {
42     m=read();
43     rep(i,0,m) a[i]=read();
44     n=read();
45     rep(i,0,n) x[i]=read(),y[i]=read(),f[i]=i;
46     rep(i,0,n-1){
47         rep(j,i+1,n)
48         addedge(i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
49     }
50     sort(e,e+cnt);
51     rep(i,0,cnt){
52         int s=find(e[i].u),t=find(e[i].v);
53         if(s!=t){
54             f[s]=t;
55             mn=max(mn,e[i].d);
56         }
57     }
58     rep(i,0,m) if(a[i]>=mn) ans++;
59     printf("%d\n",ans);
60     return 0;
61 }

2429: [HAOI2006]聪明的猴子

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 549  Solved: 377
[Submit][Status][Discuss]

Description

在一个热带雨林中生存着一群猴子,它们以树上的果子为生。昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上。猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实。

现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都很小,可以忽略不计。我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表示(任意两棵树的坐标都不相同)。

在这个地区住着的猴子有M个,下雨时,它们都躲到了茂密高大的树冠中,没有被大水冲走。由于各个猴子的年龄不同、身体素质不同,它们跳跃的能力不同。有的猴子跳跃的距离比较远(当然也可以跳到较近的树上),而有些猴子跳跃的距离就比较近。这些猴子非常聪明,它们通过目测就可以准确地判断出自己能否跳到对面的树上。

【问题】 现已知猴子的数量及每一个猴子的最大跳跃距离,还知道露出水面的每一棵树的坐标,你的任务是统计有多少个猴子可以在这个地区露出水面的所有树冠上觅食。

Input

第1行为一个整数,表示猴子的个数M(2<=M<=500);

第2行为M个整数,依次表示猴子的最大跳跃距离(每个整数值在1--1000之间);

第3行为一个整数表示树的总棵数N(2<=N<=1000);

第4行至第N+3行为N棵树的坐标(横纵坐标均为整数,范围为:-1000--1000)。

(同一行的整数间用空格分开)

Output

包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数

Sample Input

4
1 2 3 4
6
0 0
1 0
1 2
-1 -1
-2 0
2 2

Sample Output

3

HINT

对于40%的数据,保证有2<=N <=100,1<=M<=100

对于全部的数据,保证有2<=N <= 1000,1<=M=500

Source

Day2

[Submit][Status][Discuss]

时间: 2024-10-08 14:41:07

bzoj2429的相关文章

BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]

2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 896  Solved: 575[Submit][Status][Discuss] Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实. 现在,在

bzoj2429[HAOI2006]聪明的猴子

题意: 平面上N个点(任意两个点的坐标都不相同).现已知M个猴子的最大跳跃距离,还知道N个点坐标,统计有多少个猴子可以在所有点上觅食. 题解: 题目中隐含了一个条件,就是猴子可以从任意点出发.因此我们可以确定一个点,求出它到所有点的最小距离的最大值,然后判断每只猴子的跳跃距离是否大于等于这个最大值.这正是MST问题,用Kruscal排序后选的第n-1条边的长度就是根到所有点的最小距离的最大值. 代码: 1 #include <cstdio> 2 #include <algorithm&g

20160417~20160423

又是一周总结时间~中间有一周停了是因为本弱去准备考试了.下星期就是GDOI了,本弱还是去旅游!比赛什么的……蒟蒻早已准备退役了. 20160418: 1.bzoj3223 http://www.lydsy.com/JudgeOnline/problem.php?id=3223 题意:一个数列,支持区间翻转操作. 代码: 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #define in

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ