输入 | 含义 | |
1 | C NAME RP_VALUE | 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000) |
2 | G | 排在面试队伍最前面的同学面试结束离开考场。 |
3 | Q | 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。 |
今天单调队列STL不会用,裸的单调队列没想出来,被柯黑狂D……
赶紧敲个模板练练手,顺带想题……
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #include<cmath> #include<cctype> #include<cassert> #include<climits> #include<queue> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForD(i,n) for(int i=n;i;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define RepD(i,n) for(int i=n;i>=0;i--) #define MEM(a) memset(a,0,sizeof(a)) #define MEMI(a) memset(a,127,sizeof(a)) #define MEMi(a) memset(a,128,sizeof(a)) #define INF (2139062143) #define F (1000000009) #define MAXN (1000000+10) typedef long long ll; int T; struct man { int i,v; friend bool operator<(man a,man b){return a.v<b.v;} }a[MAXN],q[MAXN]; char s[100]; int main() { // freopen("fzu1894.in","r",stdin); int T;cin>>T; while (T--) { int head=1,tail=0; scanf("%s",s); int j=1,i=0; while (scanf("%s",s)&&strcmp(s,"END")!=0) { switch (s[0]) { case'C': { i++; scanf("%s%d",s,&a[i].v);a[i].i=i; while (head<=tail&&q[tail]<a[i]) tail--; q[++tail]=a[i]; break; } case'Q': { if (head<=tail) printf("%d\n",q[head].v); else puts("-1"); break; } case'G': { j++; if (q[head].i<j) head++; } } } } return 0; }