描述 Description
约翰准备教他的奶牛们弹一首歌. 这首歌由 N(l ≤ N ≤50000)个音阶组成,第 i 个音阶要敲击 Bi(l ≤ Bj ≤ 10000)次. 奶牛从第 0 时刻开始弹,因此他从 0 时刻到 B1-1 时刻都是敲第 1 个音阶,然后他从 B1 时刻到 B1+B2-1 时刻敲第 2 个音阶,从 B1+B2 时刻到 B1+B2+B3-1 时刻敲第 3 个音阶…… 现在有 Q( l ≤ Q ≤ 50000)个问题: 在时间段区间 [T,T+1) 内,奶牛敲的是哪个音阶?
看下面的一首歌, 第 1 个音阶持续 2 个单位时间,第 2 个音阶持续 1 个单位时间,第 3 个音阶持续 3 个单位时间.
以下是一些询问和回答:
输入格式 InputFormat
第 1 行:两个整数 N,Q.
第 2 到 N+1 行:第 i+l 行只有一个整数 Bi.
第 N+2 到 N+Q+I 行:第 N+i+l 行只有一个整数 Ti.
输出格式 OutputFormat
第 1 到 Q 行:对与每个询问,在词问的时间内,奶牛敲击的是哪个音阶?
样例输入 SampleInput
10 10
1
4
2
5
3
1
4
3
2
3
25
23
10
11
22
12
7
19
22
9
样例输出 SampleOutput
10
9
4
4
8
5
4
7
8
4
来源 Source
Silver
代码 Code
前缀和记录,二分查找求答案。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int i,j,t,n,m,l,r,k,z,y,x;
vector <int> sum;
int q;
int main()
{
scanf("%d%d",&n,&q);
for (i=1;i<=n;i++)
{
scanf("%d",&x);
if (i>1) sum.push_back(sum.back()+x);
else sum.push_back(x);
}
for (i=1;i<=q;i++)
{
scanf("%d",&x);
printf("%d\n",upper_bound(sum.begin(),sum.end(),x)-sum.begin()+1);
}
return 0;
}