LGOJ P1886 【滑动窗口】

【模板】单调队列

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N];
int k,n;
inline int read()
{
    char c=getchar();int x=0;bool minus=0;
    for(;!isdigit(c);c=getchar())
        if(c=='-')minus=1;
    for(;isdigit(c);c=getchar())
        x=x*10+c-'0';
    if(minus)return -x;
    else return x;
}
deque<int> Q;

inline void ins_min(int i)
{
    while(!Q.empty()&&a[Q.back()]>=a[i])Q.pop_back();
    Q.push_back(i);
    while(!Q.empty()&&Q.front()<=i-k)Q.pop_front();
}

inline void ins_max(int i)
{
    while(!Q.empty()&&a[Q.back()]<=a[i])Q.pop_back();
    Q.push_back(i);
    while(!Q.empty()&&Q.front()<=i-k)Q.pop_front();
}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<k;i++)ins_min(i);
    for(int i=k;i<=n;i++)
    {
        ins_min(i);
        printf("%d ",a[Q.front()]);
    }
    Q.clear();
    cout<<endl;
    for(int i=1;i<k;i++)ins_max(i);
    for(int i=k;i<=n;i++)
    {
        ins_max(i);
        printf("%d ",a[Q.front()]);
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kion/p/11817038.html