其他分享
首页 > 其他分享> > 洛谷 P2032 扫描 题解

洛谷 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;
    }
}

 

标签:2000010,洛谷,int,题解,进队,队列,区间,P2032,单调
来源: https://www.cnblogs.com/kamimxr/p/11345483.html