[JSOI2008]最大数maxnumber

Time Limit: 3 Sec    Memory Limit: 162 MB

Description

现在请求你维护一个数列,要求提供以下两种操作: 1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。 2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。

Input

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0< div>

Output

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

Sample Input

5 100
A 96
Q 1
A 97
Q 1
Q 2

Sample Output

96
93
96
 
这是道比较简单的线段树的题目。操作数为200000,就开个200000*8的数组,然后维护就可以了。。。每一个数组单元记录某段长度内的最大值。
 
AC CODE
 
program hy_1012;
var a: array [ 1..1000000 ] of longint ;
     s,t,m,n,i,fin,ans,mo,tt,l,z: longint ;
     command: char ;
//============================================================================
procedure ins(be,en,now: longint );
var mid: longint ;
begin
   if be=en then
   begin a[now]:=z; exit; end ;
   mid:=(be+en) div 2 ;
   if fin<=mid then ins(be,mid,now shl 1 ) else
   ins(mid+ 1 ,en,now shl 1 + 1 );
   if a[now shl 1 ]>a[now shl 1 + 1 ] then a[now]:=a[now shl 1 ] else
   a[now]:=a[now shl 1 + 1 ];
end ;
//============================================================================
procedure ask(be,en,now: longint );
var mid: longint ;
begin
   if (be>=s) and (en<=t) then
   begin
     if a[now]>ans then ans:=a[now];
     exit;
   end ;
   mid:=(be+en) div 2 ;
   if t<=mid then ask(be,mid,now shl 1 ) else
   if s>mid then ask(mid+ 1 ,en,now shl 1 + 1 ) else
   begin
     ask(be,mid,now shl 1 );
     ask(mid+ 1 ,en,now shl 1 + 1 );
   end ;
end ;
//============================================================================
begin
   readln(m,mo);
   tt:= 0 ; fin:= 0 ; n:= 200000   //fin表示当前数目个数。tt表示上次查询的值。
   begin
     read(command);
     if command= 'A' then
     begin
       readln(z); inc(fin);
       z:=(z+tt) mod mo; ins( 1 ,n, 1 );
     end else
     begin
       readln(l);
       s:=fin-l+ 1 ; t:=fin;
       ans:=-maxlongint; ask( 1 ,n, 1 );
       writeln (ans); tt:=ans;
     end ;
   end ;
end .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值