例题
唯一的思想就是
- 注意一定要判断队列不为空时
首先要把过期的元素删掉。
最小值:如果他小于他前面的,那么前面的一定不是最优解
最大值:如果他大于前面的,那么前面的一定不是最优解
#include<bits/stdc++.h>
using namespace std;
struct dd {
int num,x;
dd(int xx=0,int yy=0):num(xx),x(yy) {
}
};
const int maxn=1000000+20;
deque<dd>op;
int minn[maxn],maxx[maxn],a[maxn];
int main() {
int m,n;
cin>>m>>n;
for(int i=1; i<=m; i++) {
cin>>a[i];
}
//先求最小值
//单调队列求最小值
for(int i=1; i<=m; i++) {//
if(!op.empty())
{
while(op.front().x<i-n+1) {
op.pop_front();
if(op.empty())break;
}
while(op.back().num>a[i]&&!op.empty()) {
op.pop_back();
if(op.empty())break;
}
}
op.push_back(dd(a[i],i));
if(i>=n)
cout<<op.front().num<<" ";
}
cout<<endl;
op.clear();
// for(int i=1; i<=n-1; i++) {
//op.push_back(dd(a[i],i));
// }
for(int i=1; i<=m; i++) {//单调队列求最大值
if(!op.empty())
{
while(op.front().x<i-n+1) {
op.pop_front();
if(op.empty())break;
}
while(op.back().num<a[i]&&!op.empty()) {
op.pop_back();
if(op.empty())break;
}
}
op.push_back(dd(a[i],i));
if(i>=n)
cout<<op.front().num<<" ";
}
return 0;
}