Sliding Window 单调队列解决--经典滑动窗口问题--求窗口的最大值最小值

http://poj.org/problem?id=2823

这就要用到单调递减或单调递增队列来实现,它的头元素一直是队列中的最小值或最大值。我们可以从队列的末尾插入一个元素,可以从队列的两端删除元素。

插入元素:

对于单调递减队列:队头放最大值,为了保持队列的递减性,我们在插入元素v的时候,要将队尾元素与v比较,如果队尾v,这时才将v插入队尾。

删除队首元素:

队尾元素的删除刚刚已经说了,那么队首的元素什么时候删除呢?当队首元素的索引或下标小于i-k+1的时候,说明队首元素已经没用了,因为他已经不在窗里了,所以当队首元素索引或下标

#include
#include
#include
using namespace std;
const int maxn=1e6+6;
struct node
{
    int val,id;
};
int minn[maxn],maxx[maxn],a[maxn];
int main()
{
    int n,k,i;
    node now;
    dequeqmin;
    dequeqmax;
    scanf("%d%d",&n,&k);
    scanf("%d",&now.val);
    now.id=1;
    a[1]=now.val;
    minn[1]=now.val;
    qmin.push_back(now);
    for(i=2;i<=n;i++)
    {
        scanf("%d",&a[i]);
        now.val=a[i];
        now.id=i;
        while(!qmin.empty()&&qmin.back().val>a[i])
            qmin.pop_back();
        qmin.push_back(now);
        if(!qmin.empty()&&qmin.front().id

 

你可能感兴趣的:(STL)