当前位置:   article > 正文

洛谷 P1886 滑动窗口 /【模板】单调队列_洛谷滑动窗口示例代码

洛谷滑动窗口示例代码

例1.3

  1. #include<iostream>
  2. #include<deque>
  3. using namespace std;
  4. const int max_n = 1e6 + 5;
  5. int a[max_n];//序列a
  6. deque<int> q;//窗口队列,其中的数据是元素在a序列中的位置
  7. int main() {
  8. int n, k;
  9. cin >> n >> k;
  10. //初始化序列a
  11. for (int i = 1; i <=n; i++) {
  12. cin >> a[i];
  13. }
  14. //每个窗口的最小值
  15. for (int i = 1; i <= n; i++) {
  16. //保证第i个数加入窗口时保证末尾数字最大
  17. while (!q.empty() && a[q.back()] > a[i]) q.pop_back();
  18. q.push_back(i);
  19. //窗口开始滑动
  20. if (i >= k) {
  21. //对列头的数字超过窗口的范围,弹出
  22. while (!q.empty() && i-q.front()>=k ) q.pop_front();
  23. cout << a[q.front()] << " ";
  24. }
  25. }
  26. //清空窗口队列
  27. q.clear();
  28. cout << endl;
  29. //每个窗口的最大值
  30. for (int i = 1; i <= n; i++) {
  31. //保证第i个数加入窗口时保证末尾数字最小
  32. while (!q.empty() && a[q.back()] < a[i])q.pop_back();
  33. q.push_back(i);
  34. //窗口开始滑动
  35. if (i >= k) {
  36. //对列头的数字超过窗口的范围,弹出
  37. while (!q.empty() && i - q.front() >= k)q.pop_front();
  38. cout << a[q.front()] << " ";
  39. }
  40. }
  41. }

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

闽ICP备14008679号