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

被折叠的 条评论
为什么被折叠?



