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);
	}
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter