QLU Regular Contest 003 D Youmu with beautiful dolls queue

这篇博客介绍了一种利用STL中的deque和map数据结构解决数组操作后求最大值和最小值的问题。通过维护一个deque来模拟数组操作,并用map记录每个数字的出现次数。在进行POP和PUSH操作时,动态更新最大值和最小值。当队列为空或最大值和最小值的计数为0时,重新遍历deque以获取新的最大值和最小值。代码中给出了详细的实现过程。

原题链接:QLU Regular Contest 003 D题的链接

题意:

N N N个数的数组, M M M个操作如下:

P O P   B A C K POP \ BACK POP BACK 数组末尾数出队

P O P   F R O N T POP \ FRONT POP FRONT 数组头部数出队

P U S H   F R O N T PUSH \ FRONT PUSH FRONT 数组头部插入一个数

P U S H   B A C K PUSH \ BACK PUSH BACK 数组尾部插入一个数

求每次操作后的最大值和最小值

思路:

应用两个STL中的容器 d e q u e deque deque m a p map map

deque.pop_back();

deque.pop_front();

deque.push_front();

deque.push_back();

对应上面四个操作

把原数组的最大值和最小值先记录下来,然后用map记录每个数字出现的次数

1.出队后判断之前的最大值最小值出现次数是否为0,若为0遍历一遍deque更新一下

2.新数字入队时更新一下最大值最小值

3.deque.empty()判断一下队列是否为空

然后每次输出最大值和最小值就可以了

代码
#include<iostream>
#include<cstdio>
#include<deque>
#include<map>

using namespace std;

deque<int> q;

int n,m;
map<int,int> mp;

int main() {
	cin >> n >> m;
	int maxn = 0;
	int minn = 1e9 + 1;
	while(n--) {
		int x;
		scanf("%d", &x);
		maxn = max(maxn, x);
		minn = min(minn, x);
		q.push_back(x);
		mp[x]++;
	}
	while(m--) {
		char op1[10];
		scanf("%s", op1);
		if(op1[1] == 'U') {
			char op2[10];
			int x;
			scanf("%s%d", op2,&x);
			if(op2[0] == 'B') {
				maxn = max(maxn, x);
				minn = min(minn, x);
				q.push_back(x);
				mp[x]++;
			}
			else {
				q.push_front(x);
				maxn = max(maxn, x);
				minn = min(minn, x);
				mp[x]++;
			}
		}
		else {
			char op2[10];
			scanf("%s", op2);
			if(q.empty()) {
				printf("EMPTY\n");
				continue;
			}
			if(op2[0] == 'B') {
				mp[q.back()]--;
				q.pop_back();
			}
			else {
				mp[q.front()]--;
				q.pop_front();
			}
		}
		if(q.empty()) {
			printf("EMPTY\n");
			continue;
		}
		if(mp[maxn] == 0) {
			maxn = 0;
			for(deque<int>::reverse_iterator it = q.rbegin(); it != q.rend();it++) {
				maxn = max(maxn, *it);
			}
		}
		if(mp[minn] == 0) {
			minn = 1e9 + 1;
			for(deque<int>::reverse_iterator it = q.rbegin(); it != q.rend();it++) {
				minn = min(minn, *it);
			}
		}
		printf("%d %d\n", minn,maxn);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值