Gunner
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1637 Accepted Submission(s): 705
Problem Description
Long long ago, there is a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are
n
birds and n
trees. The i−th
bird stands on the top of the i−th
tree. The trees stand in straight line from left to the right. Every tree has its height. Jack stands on the left side of the left most tree. When Jack shots a bullet in height H to the right, the bird which stands in the tree with height
H
will falls.
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
.
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
There are multiple test cases (about 5), every case gives
n,m
in the first line, n
indicates there are n
trees and n
birds, m
means Jack will shot m
times.
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≤n,m≤1000000(10
6
)![]()
1≤h[i],q[i]≤1000000000(10
9
)![]()
All inputs are integers.
In the second line, there are n
In the third line, there are m numbers q[1],q[2],q[3],…,q[m]
Please process to the end of file.
[Technical Specification]
1≤n,m≤1000000(10
1≤h[i],q[i]≤1000000000(10
All inputs are integers.
Output
For each q[i]
,
output an integer in a single line indicates the number of birds Jack shot down.
Sample Input
4 3 1 2 3 4 1 1 4
Sample Output
1 0 1HintHuge input, fast IO is recommended.
这里数据量比较大,建议用fast IO读入,但是好像用scanf就行,这里既然用了,就贴出来。
卡内存的一个题、10^9,一维数组不能开那么大,用map直接搞定就行了:
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
int read()
{
int res = 0, ch, flag = 0;
if((ch = getchar()) == '-') //判断正负
flag = 1;
else if(ch >= '0' && ch <= '9') //得到完整的数
res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9' )
res = res * 10 + ch - '0';
return flag ? -res : res;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
map<int,int >a;
for(int i=0;i<n;i++)
{
int k;
k=read();
a[k]++;
}
while(m--)
{
int k;
k=read();
printf("%d\n",a[k]);
a[k]=0;
}
}
}