非单调队列

来源:互联网 发布:人工智能的股票有哪些 编辑:程序博客网 时间:2024/06/05 21:49

维护一个队列。

1、将一个整数插入到队尾;

2、从队头删除一个数,如果队列为空则忽略;

3、将队列中所有的数字变成其相反数;

4、输出队列中的最大值,如果队列为空不输出;

#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<vector>using namespace std;const int maxn=2000000;const int inf=0x80000000;struct myqueue{struct value{int pos;int value;}val[maxn];int vhead,vtail;int head,tail;void push(int x){while(vtail>vhead&&val[vtail-1].value<=x)vtail--;val[vtail].value=x;val[vtail].pos=tail;tail++;vtail++;}void pop(){if(vhead<vtail&&val[vhead].pos==head){vhead++;}if(head<tail)head++;}int Max(){if(vhead==vtail)return inf;elsereturn val[vhead].value;}void init(){head=tail=vhead=vtail=0;}}q[2];int main(){int tc,tt;char cmd[10];int arg;int ans;int n;int pos,neg;scanf("%d",&tc);for(tt=0;tt<tc;tt++){pos=0;neg=1;if(tt>0)printf("\n");q[0].init();q[1].init();scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",cmd);if(strcmp(cmd,"PUSH")==0){scanf("%d",&arg);q[pos].push(arg);q[neg].push(-arg);}else if(strcmp(cmd,"POP")==0){q[pos].pop();q[neg].pop();}else if(strcmp(cmd,"MINUS")==0){pos=neg;neg=1-pos;}else{ans=q[pos].Max();if(ans!=inf)printf("%d\n",ans);}}}return 0;}
from sysuoj.


原创粉丝点击