luoguP1886 滑动窗口

单调队列。。。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],ans2[maxn],q1[maxn],q2[maxn];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    int l1=1,r1=0,l2=1,r2=0;
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        while(l1<=r1&&i-q1[l1]>=k)l1++;
        while(l2<=r2&&i-q2[l2]>=k)l2++;
        while(l1<=r1&&a[q1[r1]]<=a[i])--r1;
        while(l2<=r2&&a[q2[r2]]>=a[i])--r2;
        q1[++r1]=i;q2[++r2]=i;
        ans2[i]=a[q1[l1]];
        if(i>=k)
        printf("%d ",a[q2[l2]]);
    }
    printf("\n");
    for(int i=k;i<=n;++i)printf("%d ",ans2[i]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Dream-Runner/p/9428073.html