题目大意:
一首歌曲由N种音节组成,编号为1到N,而且一定按照从1到N的顺序进行弹奏,第i种音节持续B_i个节拍,节拍0到节拍B_1-1弹奏的是第1种音节,从B_1到B_1+B_2-1弹奏的是第2种音节,依此类推。
给出Q个询问,让你回答第T_i次节拍弹奏的是哪种音节。
1<=N<=50,000
1<=B_i<=10,000
0<=T_i<=节拍总数-1
1<=Q<=50,000
题解:
模拟+二分:
这题因为数据问题,很明显不能开一个大数组去暴力,不过我们可以记录第i个音节的开始与结束,
然后对于一个查询Ti,就直接二分求解。
时间复杂度:O(Q*log2 N)
var
p:array [0..50001,1..2] of longint;
x,i,j,n,m,l,r,mid:longint;
begin
assign(input,'mnotes.in'); reset(input);
assign(output,'mnotes.out'); rewrite(output);
readln(n,m);
p[1,1]:=0;
for i:=1 to n do
begin
readln(x);
p[i,2]:=p[i,1]+x-1;
p[i+1,1]:=p[i,2]+1;
end;
for i:=1 to m do
begin
readln(x);
l:=1; r:=n;
while l<=r do
begin
mid:=(l+r) div 2;
if x<p[mid,1] then r:=mid-1
else if x>p[mid,2] then l:=mid+1
else break;
end;
writeln(mid);
end;
close(input); close(output);
end.