Description
Jack will shot many times, he wants to know how many birds fall during each shot.
a bullet can hit many birds, as long as they stand on the top of the tree with height of $H$.
Input
In the second line, there are $n$ numbers $h[1],h[2],h[3],…,h[n]$ which describes the height of the trees.
In the third line, there are m numbers $q[1],q[2],q[3],…,q[m]$ which describes the height of the Jack’s shots.
Please process to the end of file.
[Technical Specification]
$1 \leq n,m \leq 1000000(10^{6})$
$1 \leq h[i],q[i] \leq 1000000000(10^{9})$
All inputs are integers.
Output
Sample Input
4 3 1 2 3 4 1 1 4
Sample Output
1 0 1
Hint
Huge input, fast IO is recommended.
题目分析
问题描述 很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。 这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时, 站在高度为H的树上且离Jack最近的鸟儿就会落下来。 Jack会射击多次,他想知道每次射击哪只鸟儿会落下来。 输入描述 多组测试数据(大概5组),每一组的第一行给出n,m,n表示有n棵树和n只鸟,m表示Jack会射击m次。 在第二行,有n个整数h[1],h[2],h[3],…,h[n]表示这些树的高度。 在第三行,有m个整数,q[1],q[2],q[3],…,q[m]表示Jack射击的高度。 [参数约定] 所有输入均为整数。 1<=n,m<=100000(10^5) 1<=h[i],q[i]<=1000000000(10^9)
注意:相同高度的掉下来一次后再打此高度就会输出0,用map容器,注意每次都要运行后清除这一高度的数
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<iostream> #include<string> #include<algorithm> #include<set> #include<vector> #include<queue> #include<map> #include<numeric> #include<stack> #include<list> const int INF=1<<30; const int inf=-(1<<30); using namespace std; int main() { int n,m; while(cin>>n>>m) { int a,b; map<int,int>ma; for(int i=0; i<n; i++) { scanf("%d",&a); ma[a]++; } for(int i=0; i<m; i++) { scanf("%d",&b); if(ma.find(b)!=ma.end()) { cout<<ma[b]<<endl; ma.erase(b); } else cout<<"0"<<endl; } } return 0; }