与题解不太一样的方法求调(悬 2 关)
查看原帖
与题解不太一样的方法求调(悬 2 关)
809729
SJZ2010楼主2023/8/28 09:13

思路:

  1. 压入队尾:直接压 xx。

  2. 删除:判断会不会把队头删除,会删除就删除,不会就增加实际队列的队头。

  3. 查询:类似于删除,但不弹出队头。

  4. 查最大值:优先队列和 map 维护最大值及是否存在。

#17 WA 了。

#include <cstdio>
#include <stack>
#include <queue>
#include <map>

typedef long long ll;

const int MAX = 2e5+5;

int c, q, opt, x;
std::priority_queue< int > PQ;
std::map< int, int > appear;

struct Queue{
	int front, tail, head;
	int val[MAX];
	Queue(int h = 1, int t = 0){
		front = head = h;
		tail = t;
	}
	void push(int x){
		val[++tail] = x;
	}
	void pop(){
		front++;
	}
}Q;

int main(){
	scanf("%d %d", &c, &q);
	while(q--){
		scanf("%d", &opt);
		if(opt == 1){
			scanf("%d", &x);
			Q.push(x);
			appear[x]++;
			PQ.push(x);
		}else if(opt == 2){
			scanf("%d", &x);
			//printf("2.1: %d %d\n", Q.val[Q.front], Q.head);
			while(x >= Q.val[Q.front]-Q.head+1)
				x -= (Q.val[Q.front]-Q.head+1), appear[Q.val[Q.front]]--, Q.pop(), Q.head = 1;
			Q.head += (x);
			//printf("2.2: %d %d\n", Q.val[Q.front], Q.head);
		}else if(opt == 3){
			scanf("%d", &x);
			if(x <= Q.val[Q.front]-Q.head+1){
				printf("%d\n", Q.head+x-1);
				continue;
			}
			int p = Q.front+1;			
			x -= (Q.val[Q.front]-Q.head+1);
			while(x > Q.val[p])
				x -= Q.val[p], p++;
			printf("%d\n", x);
		}else if(opt == 4){
			while(appear[PQ.top()] <= 0)
				PQ.pop();
			printf("%d\n", PQ.top()/*, appear[PQ.top()]*/);
		}
	}
	return 0;
}
2023/8/28 09:13
加载中...