BZOJ 1012: [JSOI2008]最大数maxnumber
Fancy
posted @ 2015年7月08日 22:43
in BZOJ
, 393 阅读
题目大意:现在请求你维护一个数列,要求提供以下两种操作:
1、查询操作。查询当前数列中末尾L个数中的最大的数,并输出这个数的值。
限制:L不超过当前数列的长度。
2、插入操作。将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。
限制:n是非负整数并且在长整范围内。
单调队列
我按我自己的方法写的,也许和标准的单调队列不太一样。。。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int a[200001]; int n,m,x,t,num; char c; void add(int x) { int i=num; while(a[i]<=x&&i>0) a[i]=a[0],i--; a[++num]=x; } int quary(int x) { for(int i=num-x+1;i<=num;i++) if(a[i]>a[0]) return a[i]; } int main() { memset(a,-0x7f,sizeof(a)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%c",&c); while(c!='A'&&c!='Q') scanf("%c",&c); scanf("%d",&x); if(c=='A') add((t+x)%m); if(c=='Q') t=quary(x),printf("%d\n",t); } }