#include<bits/stdc++.h> using namespace std; struct Node { int num; int M; //当前栈中的最大值 Node* next; }; struct Stack { Node* b; //栈底指针 Node* t; //栈顶指针 int size=0; Stack() { b = new Node; t = b; } int top() { return t->num; } void push(int num) { Node* p = new Node; p->num = num; p->next = t; t = p; size++; } void pop() { Node* p = t; t = t->next; delete p; size--; } int Min(){ Stack s; Node* p = t; while(p!=b){ if(s.size==0||p->num<s.top()){ s.push(p->num); }else{ s.push(s.top()); } p = p->next; } int res = s.top(); while(s.size>0){ s.pop(); } // return res; } int Max() { Stack s; Node* p = t; while(p!=b) { if(s.size==0||p->num>s.top()) { s.push(p->num); } else { s.push(s.top()); } p = p->next; } int res = s.top(); while(s.size>0) { s.pop(); } return res; } }; int a[1000005]; int main() { int n,k; cin>>n>>k; for(int i=0; i<n; i++) { cin>>a[i]; } Stack smax,smin; //维护最大值和最小值的栈 for(int i=0; i<n; i++) { smin.push(a[i]); smax.push(a[i]); } // cout<<smin.Min()<<"\n"<<smax.Max()<<" "; for(int i=k; i<n; i++) { smin.pop(); smax.pop(); smin.push(a[i]); smax.push(a[i]); cout<<smin.Min()<<"\n"<<smax.Max()<<"\n"; } return 0; }这段代码怎么改可以满足使用遍历获取队列中的极值完成洛谷p1886
时间: 2023-12-02 18:02:07 浏览: 78
根据题目要求,需要使用队列来实现。可以使用双端队列deque来实现。具体修改代码如下:
```
#include<bits/stdc++.h>
using namespace std;
deque<int> qmax,qmin; //维护最大值和最小值的队列
int a[1000005];
int main() {
int n,k;
cin>>n>>k;
for(int i=0; i<n; i++) {
cin>>a[i];
}
// 初始化队列
for(int i=0; i<k-1; i++) {
while(!qmin.empty() && a[i]<qmin.back()) {
qmin.pop_back();
}
qmin.push_back(a[i]);
while(!qmax.empty() && a[i]>qmax.back()) {
qmax.pop_back();
}
qmax.push_back(a[i]);
}
for(int i=k-1; i<n; i++) {
//将队列中超出窗口大小的元素弹出
if(!qmin.empty() && qmin.front() == a[i-k]) {
qmin.pop_front();
}
if(!qmax.empty() && qmax.front() == a[i-k]) {
qmax.pop_front();
}
//将新元素加入队列
while(!qmin.empty() && a[i]<qmin.back()) {
qmin.pop_back();
}
qmin.push_back(a[i]);
while(!qmax.empty() && a[i]>qmax.back()) {
qmax.pop_back();
}
qmax.push_back(a[i]);
//输出队列中的最小值和最大值
cout<<qmin.front()<<"\n"<<qmax.front()<<"\n";
}
return 0;
}
```
在这段代码中,我们使用了双端队列deque来维护最大值和最小值。在初始化队列时,我们依次将前k-1个元素加入队列,并维护队列的单调性。在遍历后面的元素时,首先将窗口左边的元素从队列中弹出,然后将新元素加入队列并维护队列的单调性。最后输出队列中的最小值和最大值即可。
阅读全文