洛谷 P1440 单调队列

来源:互联网 发布:手机炒金属软件 编辑:程序博客网 时间:2024/05/21 21:57

维护一个递增的队列,每次队首进,队尾出,取队尾元素(下标相差在m之内的)

#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <deque>using namespace std;typedef long long LL;const int maxn=2000005;struct node{    int v,id;}a[maxn];int ans[maxn];int n,m;deque<node>dq;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%d",&a[i].v);        a[i].id=i;    }    ans[1]=0;    for(int i=2;i<=n;i++){        while(!dq.empty()&&dq.front().v>=a[i-1].v){            dq.pop_front();        }        dq.push_front(a[i-1]);        while(dq.back().id<i-m){            dq.pop_back();        }        ans[i]=dq.back().v;    }    for(int i=1;i<=n;i++){        printf("%d\n",ans[i]);    }    return 0;}
0 0