链接:https://ac.nowcoder.com/acm/contest/1077/I
来源:牛客网
Music Notes
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
FJ is going to teach his cows how to play a song. The song consists of N (1 <= N <= 50,000) notes, and the i-th note lasts for Bi (1 <= Bi <= 10,000) beats (thus no song is longer than 500,000,000 beats). The cows will begin playing the song at time 0; thus, they will play note 1 from time 0 through just before time B1, note 2 from time B1 through just before time B1 + B2, etc.
However, recently the cows have lost interest in the song, as they feel that it is too long and boring. Thus, to make sure his cows are paying attention, he asks them Q (1 <= Q <= 50,000) questions of the form, “In the interval from time T through just before time T+1, which note should you be playing?” The cows need your help to answer these questions which are supplied as Ti (0 <= Ti <= end_of_song).
Consider this song with three notes of durations 2, 1, and 3 beats:
Beat: 0 1 2 3 4 5 6 …
|----|----|----|----|----|----|— …
1111111111 : :
22222: :
333333333333333:
Here is a set of five queries along with the resulting answer:
Query Note
2 2
3 3
4 3
0 1
1 1
输入描述:
- Line 1: Two space-separated integers: N and Q
- Lines 2…N+1: Line i+1 contains the single integer: Bi
- Lines N+2…N+Q+1: Line N+i+1 contains a single integer: Ti
输出描述: - Lines 1…Q: Line i of the output contains the result of query i as a single integer.
示例1
输入
复制
3 5
2
1
3
2
3
4
0
1
输出
复制
2
3
3
1
1
/*
这题时这场比赛的弱化版,下一题是强化版,这份代码均适用。
x先余前缀最大和,
然后二分第一个大于等于,
后面特判一下,如果等于的话,res+1即可。
*/
#include <iostream>
using namespace std;
const int MAXN = 5e4+5;
int s[MAXN];
int main()
{
int n,q;
cin>>n>>q;
int x;
s[0] = 0;
for(int i = 1; i <= n; i++)
{
cin>>x;
s[i] = s[i-1] + x;
}
while(q--)
{
cin>>x;
x %= s[n];
int l = 1, r = n,res = 0;
while(l <= r)
{
int mid = (l + r) >> 1;
if(x <= s[mid])
{
res = mid;
r = mid - 1;
}
else l = mid + 1;
}
int ans = 0;
if(x < s[res])
ans = res;
else
ans = res + 1;
cout<<ans<<endl;
}
return 0;
}