洛谷【P1886】滑動窗口
阿新 • • 發佈:2019-01-24
href d+ list log print namespace ++ lin ||
淺談隊列:https://www.cnblogs.com/AKMer/p/10314965.html
題目傳送門:https://www.luogu.org/problemnew/show/P1886
掃兩遍,單調隊列維護最值即可。
時間復雜度:\(O(n)\)
空間復雜度:\(O(n)\)
代碼如下:
#include <cstdio> using namespace std; const int maxn=1e6+5; int n,k,head,tail; int a[maxn],list[maxn]; int read() { int x=0,f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main() { n=read(),k=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=k;i++) { while(tail!=head&&a[list[tail-1]]>a[i])tail--; list[tail++]=i; } printf("%d ",a[list[head]]); for(int i=k+1;i<=n;i++) { while(tail!=head&&a[list[tail-1]]>a[i])tail--; list[tail++]=i; while(tail!=head&&i-list[head]>=k)head++; printf("%d ",a[list[head]]); }puts("");head=tail=0; for(int i=1;i<=k;i++) { while(tail!=head&&a[list[tail-1]]<a[i])tail--; list[tail++]=i; } printf("%d ",a[list[head]]); for(int i=k+1;i<=n;i++) { while(tail!=head&&a[list[tail-1]]<a[i])tail--; list[tail++]=i; while(tail!=head&&i-list[head]>=k)head++; printf("%d ",a[list[head]]); } return 0; }
洛谷【P1886】滑動窗口