hdu 5199 Gunner (hash || 排序+二分)

题意:有n个不同高度的树排成一列,树上各有1只鸟。

然后m个询问,每次询问可以打掉h[i](1<=i<=m)高度的所有鸟,问m个询问中的各高度能打掉多少只鸟。

 

分析:

1、题目给了提示要 “快速读入”  咩~

2、排序+二分

这里可以两次二分(lower_bound找下界,upper_bound找上界)

也可以合并+二分(合并相同的数字,记录次数)

g++提交要用#include<stdio.h> 不要用#include<cstdio>

后者有效率问题,会 tle (⊙o⊙)哦~

 

二分的时候标记不用再开数组看数用过没,因为数很大啊。。这样会超内存!

直接标记上下界判断这个查找的高度是否访问过。

 

 1 //#include<cstdio>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #include<vector>
 9 #include<queue>
10 #include<map>
11 #include<set>
12 
13 using namespace std;
14 
15 typedef long long ll;
16 
17 int h[1000010];
18 map<int,int> cnt;
19 bool flag[1000010];
20 
21 int nextInt()
22 {
23     char c = getchar();
24     int t = 0;
25     while(c>='0' && c<='9')
26     {
27         t = t*10+c-'0';
28         c = getchar();
29     }
30     return t;
31 }
32 
33 int main()
34 {
35     int n,m;
36     while(~scanf("%d%d",&n,&m))
37     {
38         getchar();
39         cnt.clear();
40         for(int i=0;i<n;i++)
41         {
42             h[i] = nextInt();
43             cnt[h[i]]++;
44         }
45         sort(h,h+n);
46         memset(flag,0,sizeof(flag));
47         int en = unique(h,h+n)-h,ret;
48         for(int i=1;i<=m;i++)
49         {
50             int q = nextInt();
51             int p = lower_bound(h,h+en,q)-h;
52             if(p!=n && h[p]==q && !flag[p])   //flag[]用来标记上下界
53             {
54                 ret = cnt[q];
55                 flag[p] = true;
56             }
57             else ret = 0;
58             printf("%d\n",ret);
59         }
60     }
61     return 0;
62 }
View Code

 

还可以用map hash来做咩~

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<set>
11 
12 using namespace std;
13 
14 typedef long long ll;
15 
16 map<ll,int> cnt;
17 ll h[1000010],q;
18 
19 ll getInt()
20 {
21     ll t = 0;
22     char c = getchar();
23 //    while(c>'9' || c<'0')
24 //        c = getchar();
25     while(c>='0' && c<='9')
26     {
27         t = t*10+c-'0';
28         c = getchar();
29     }
30     return t;
31 }
32 
33 int main()
34 {
35     char c;
36     int n,m;
37     while(~scanf("%d%d",&n,&m))
38     {
39         getchar();
40         cnt.clear();
41         for(int i=1;i<=n;i++)
42         {
43             h[i] = getInt();
44             cnt[h[i]]++;
45         }
46         map<ll,int>::iterator iter;
47         for(int i=1;i<=m;i++)
48         {
49             q = getInt();
50             //iter = cnt.find(q);
51             if(cnt.count(q))
52             {
53                 printf("%d\n",cnt[q]);
54                 cnt[q] = 0;
55             }
56             else printf("0\n");
57         }
58     }
59     return 0;
60 }
View Code

 

posted @ 2015-04-05 09:47  fukan  阅读(371)  评论(3编辑  收藏  举报