当前位置:   article > 正文

第44期:数据结构-单调队列

第44期:数据结构-单调队列

参考:

单调队列 - OI Wiki

1. P1886 滑动窗口 /【模板】单调队列

  1. #include<bits/stdc++.h>
  2. #include<stack>
  3. using namespace std;
  4. const int maxn=1e6+5;
  5. int read(){
  6. int x=0,f=1;char c=getchar();
  7. while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
  8. while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
  9. return x*f;
  10. }
  11. int n,k,a[maxn];
  12. int q[maxn],head,tail,p[maxn];//q是单调队列,p是对应编号
  13. void _max(){//单调最大值
  14. head=1;
  15. tail=0;
  16. for(int i=1;i<=n;++i){
  17. while(head<=tail&&q[tail]<=a[i]) tail--;
  18. q[++tail]=a[i];
  19. p[tail]=i;
  20. while(p[head]<=i-k) head++;
  21. if(i>=k) cout<<q[head]<<" ";
  22. }
  23. cout<<"\n";
  24. }
  25. void _min(){
  26. //因为head要严格对应首元素,tail要严格对应尾元素,所以当tail>=head时,说明有元素。而一开始队列为空,说一要这样赋值。其实这跟普通队列一样。
  27. head=1;
  28. tail=0;
  29. for(int i=1;i<=n;++i){
  30. //a[i]表示当前要处理的值
  31. while(head<=tail&&q[tail]>=a[i]) tail--;
  32. //只要队列里有元素,并且尾元素比待处理值大,即表示尾元素已经不可能出场,所以出队。直到尾元素小于待处理值,满足"单调"。
  33. q[++tail]=a[i];//待处理值入队。
  34. p[tail]=i;//同时存下其编号
  35. while(p[head]<=i-k) head++;
  36. //如果队首元素已经"过时",出队。
  37. if(i>=k) cout<<q[head]<<" ";
  38. //输出最值,即队首元素。i>=k表示该输出,至于why就自己看题目
  39. }
  40. cout<<"\n";
  41. }
  42. int main(){
  43. cin>>n>>k;
  44. for(int i=1;i<=n;++i) cin>>a[i];
  45. _min();
  46. _max();
  47. return 0;
  48. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/429860
推荐阅读
相关标签
  

闽ICP备14008679号