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 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值