题意:队列问题,C为入队列,Q为输出队列中RP的最大值,G为删除队列头的元素
思路:看了别人的思路,用数组模拟单调队列
#include <stdio.h>
#include <string.h>
#define MAXN 1000100
typedef struct {
int value;
int num;
}QUEUE;
QUEUE queue[MAXN];
int main() {
int T;
char name[10];
char s[20];
scanf("%d",&T);
while (T--) {
scanf("%s", s);
int front = 1; //当前离开人的编号
int cnt = 0; //面试人数
int head = 1; //表示队列第一个
int rear = 0; //队列的长度
int rp;
while (scanf("%s",s) != EOF) {
if (!strcmp(s,"END"))
break;
if (strcmp(s, "C") == 0) {
scanf("%s%d", name, &rp);
while (head <= rear && rp > queue[rear].value)
rear--;
queue[++rear].value = rp;
queue[rear].num = ++cnt;
}
else if (strcmp(s, "G") == 0) {
while (head <= rear && queue[head].num <= front) //单调队列元素下标单调递增
head++;
front++;
}
else if (strcmp(s, "Q") == 0)
printf("%d\n",head > rear ? -1 : queue[head].value);
}
}
return 0;
}