jzoj P1592 音乐节拍

题目大意:
一首歌曲由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 x1] 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.

你可能感兴趣的:(暴力/枚举/模拟,pascal,二分&三分)