題目鏈接:http://acm.csust.edu.cn/problem/3026
Description
眾所周知桐人能砍子彈,但是有人想用數量傷到桐人,所以他帶着一群人來攻擊桐人。
桐人想知道他在第k秒時需要砍多少顆子彈,但是他砍子彈已經很辛苦了,所以他來找聰明的你來幫他算一算。
他有t次詢問,每次詢問一個k。
子彈從發射到擊中桐人要m秒,有n個人射擊,每1秒射出一發子彈(彈夾足夠大不需要換子彈,一旦開始就不會停),
現給出你這n個人開始射擊的時間,請你幫幫桐人吧。
Input
第一行3個整數n,m,t用空格分開(0≤n≤100000,1≤m≤100000,1≤t≤100000)。
第二行是n個正整數ai表示第i個人開始射擊的時間(0≤ai≤100000)。
接下來t行,每行一個數字k(0≤k≤300000)。
Output
請輸出tt行,每行一個答案(第kk秒需要砍的子彈數目)。
Sample Input 1
5 1 2 0 1 2 2 3 2 3
Sample Output 1
2 4
在原來射出的時間基礎上加上m,然后對該時間的映射++,然后做一個時間所映射的子彈數的前綴和就完事了。
當然,你也可以用排序+二分寫這題。
以下是前綴和AC代碼:
#include <bits/stdc++.h> using namespace std; const int mac=1e5+10; int a[mac],b[3*mac]; int sum[3*mac]; int main() { int n,m,t; scanf ("%d%d%d",&n,&m,&t); for (int i=1; i<=n; i++){ scanf ("%d",&a[i]); a[i]+=m;b[a[i]]++; } for (int i=1; i<=3*mac; i++){ sum[i]=sum[i-1]+b[i]; } for (int i=1; i<=t; i++){ int k; scanf ("%d",&k); printf ("%d\n",sum[k]); } return 0; }