赞
踩
单调队列并不难理解,说白了就是个队列,只不过这个队列可以两头出维护一个范围的单调性。但是,要实现这串代码还真挺巧妙的。
洛谷 p1886 滑动窗口
以下是引用洛谷的代码:
#include <bits/stdc++.h> using namespace std; #define int long long const int inf=0x3f; int n,m; int q1[1000001],q2[1000001]; int a[1000001]; int min_deque() { int h=1,t=0; for(int i=1;i<=n;i++) { if(h<=t&&q1[h]+m<=i) h++; while(h<=t&&a[i]<a[q1[t]]) t--; q1[++t]=i; if(i>=m) printf("%d ",a[q1[h]]); } cout<<endl; } int max_deque() { int h=1,t=0; for(int i=1;i<=n;i++) { if(h<=t&&q2[h]+m<=i) h++; while(h<=t&&a[i]>a[q2[t]]) t--; q2[++t]=i; if(i>=m) printf("%d ",a[q2[h]]); } } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; min_deque(); max_deque(); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。