单调队列入门题

单调队列:队列里的元素是单调的。复杂度O(2n)

洛谷 P1440 链接
题意:一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。

题解:单调队列模板题,入队时弹出,出队时判断。这题用j解除流绑定的cin还是会超时...

#include <bits/stdc++.h>
using namespace std; 
#define _for(i,a,b) for(int i=(a); i< (b); i++)
#define _rep(i,a,b) for(int i=(a); i<=(b); i++)
typedef long long ll; 

const int MAXN=2e6+5; 

struct Que{
    int idx, val;
}q[MAXN];
int a[MAXN];

int main()
{
    //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, k;
    scanf("%d%d", &n, &k);
    _rep(i, 1, n) scanf("%d", &a[i]);
    int front=1, back=0;
    _rep(i, 1, n)
    {
        if(front>back) printf("0\n");
        else
        {
            while(q[front].idx+k<i)
                front++;
            printf("%d\n", q[front].val);
        }
        while(back>=front && q[back].val>=a[i]) 
            back--;
        q[++back].val=a[i]; q[back].idx=i;
    }    
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Yokel062/p/11346281.html