1012: [JSOI2008]最大数maxnumber
1012: [JSOI2008]最大数maxnumber
Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4435 Solved: 2000
[Submit][Status]
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
Output
对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
Sample Input
A 96
Q 1
A 97
Q 1
Q 2
Sample Output
93
96
HINT
Source
1 const lx=200000;ly=trunc(ln(lx)/ln(2))+1; 2 var 3 i,j,k,l,m,n,p,t:longint; 4 a:array[0..ly,0..lx] of longint; 5 c1:char; 6 function max(x,y:longint):longint; 7 begin 8 if x>y then max:=x else max:=y; 9 end; 10 procedure add(x:longint); 11 var i,j,k:longint; 12 begin 13 x:=x mod p; 14 a[0,m+1]:=x; 15 for i:=1 to ly do 16 begin 17 j:=m-trunc(exp(i*ln(2)))+2; 18 if j<1 then break; 19 k:=j+trunc(exp((i-1)*ln(2))); 20 a[i,j]:=max(a[i-1,j],a[i-1,k]); 21 end; 22 inc(m); 23 end; 24 function last(x:longint):longint; 25 var i:longint; 26 begin 27 if x>m then exit(last(m)); 28 i:=trunc(ln(x)/ln(2)); 29 last:=max(a[i,m-x+1],a[i,m-trunc(exp(i*ln(2)))+1]); 30 end; 31 begin 32 readln(n,p); 33 m:=0; 34 for i:=1 to n do 35 begin 36 readln(c1,l); 37 case upcase(c1) of 38 ‘A‘:add(l+t); 39 ‘Q‘:begin 40 t:=last(l); 41 writeln(t); 42 end; 43 end; 44 end; 45 end. 46
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。