洛谷 P2032 扫描 题解

题面

用一个单调递减队列来维护一个区间,单调队列的头就是该区间的最大值;

因为在该数前面进队的数如果比后进的数要小就说明了前面进队的数绝对不会影响答案。

#include <bits/stdc++.h>
using namespace std;
int q[2000010];
int a[2000010];
int b[2000010];
int ans[2000010];
int main ()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int h=1,t=0;
    for(int i=1;i<=n;i++){
        while(b[h]+k-1<i&&h<=t) ++h;
        while(a[i]>q[t]&&h<=t) --t;
        b[++t]=i;
        q[t]=a[i];
        ans[i]=q[h];
    }
    for(int i=k;i<=n;i++){
        cout<<ans[i]<<endl;
    }
}
原文地址:https://www.cnblogs.com/kamimxr/p/11345483.html