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 }
还可以用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 }