jzoj P1592 音乐节拍

来源:互联网 发布:母婴用品淘宝店 编辑:程序博客网 时间:2024/06/10 05:23

题目大意:
一首歌曲由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.
原创粉丝点击