单调队列 滑动窗口模型
作用:快速取出[i,j]区间中的极值
最大:单减
最小:单增
取队首
乱序中求极值
1. 二分(有序)
2.维护单调性 : 单调队列(有序)
例题 nkoj 2152【单调队列】滑动窗口
时间限制 : 10000 MS 空间限制 : 65536 KB |
//
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000070
struct node
{
int num,id;
};
node mm[maxn];
int ans[1000070],ans1[1000070];
int main()
{ deque <node> Q;
deque <node> K;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>mm[i].num;
mm[i].id=i;
}
K.push_back(mm[1]);
Q.push_back(mm[1]);
for(int j=2;j<=n;j++)
{
while(Q.size()&&Q.back().num<=mm[j].num) Q.pop_back();
Q.push_back(mm[j]);
while(Q.front().id<=j-k) Q.pop_front();
if(j>=k) ans[j]=Q.front().num;
}
for(int j=2;j<=n;j++)
{
while(K.size()&&K.back().num>=mm[j].num) K.pop_back();
K.push_back(mm[j]);
while(K.front().id<=j-k) K.pop_front();
if(j>=k) ans1[j]=K.front().num;
}
for(int j=k;j<=n;j++)
{
cout<<ans1[j]<<" ";
}cout<<endl;
for(int j