bzoj1012: [JSOI2008]最大数maxnumber

传送门

单调队列裸题。

维护一个单调队列,队列头元素大,尾元素小,存储数值和坐标,修改时用O(1)的时间插入,询问时用O(log)的时间二分查找在区间内的最大点。

PS:刷水题有益于健康。

/**************************************************************
    Problem: 1012
    User: zhouyuyang
    Language: Pascal
    Result: Accepted
    Time:832 ms
    Memory:1972 kb
****************************************************************/
 
uses math;
var
  a,b:array [0..200005] of longint;
  n,modd,last,len,i,x,top,l,r,m:longint;
  ch:char;
begin
  readln(n,modd);
  last:=0;
  len:=0;
  for i:=1 to n do begin
    read(ch); readln(x);
    if (ch='A') then begin
      inc(len); x:=(x+last) mod modd;
      while (a[top]<=x) and (top>0) do dec(top);
      inc(top); a[top]:=x; b[top]:=len;
    end
    else begin
      l:=1; r:=top;
      while (l<r) do begin
        m:=(l+r) div 2;
        if (b[m]<len-x+1) then l:=m+1 else r:=m;
      end;
      writeln(a[l]); last:=a[l];
    end;
  end;
end.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值