http://acm.fzu.edu.cn/problem.php?pid=1894
主要用单调队列
网上看了很多单调队列的博客,略有理解,简单说一下吧。
单调队列就是队列是有序的的队列,对于每个入队的的元素,首先和队尾元素比较,是否满足升序(降序)的规则,不满足则删除队尾元素,继续比较,直到满足规则,把入队元素放在队尾,这样就是有序的队列,可以用来标记队列中最大的元素。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int a[1000001],mpq[1000001];
int heada, taila,headm,tailm;
int main()
{
int n,max;
int x,y;
scanf("%d",&n);
while(n--)
{
headm = tailm = heada = taila = 0;
char str[100];
while(scanf("%s",str) && strcmp(str,"END")!=0)
{
if(strcmp(str,"START")==0)continue;
else if(strcmp(str,"C")==0)
{
scanf("%s%d",str,&a[taila++]);
while(mpq[tailm-1]<a[taila-1] && tailm>headm)
{
tailm--;
}
mpq[tailm++] = a[taila-1];
}
else if(strcmp(str,"Q")==0)
{
if(heada==taila)printf("-1\n");
else
printf("%d\n",mpq[headm]);
}
else
{
if(a[heada]==mpq[headm])
headm++;
heada++;
}
}
heada = headm = tailm = taila = 0;
}
return 0;
}