当前位置:   article > 正文

洛谷 P1886 滑动窗口 /【模板】单调队列_洛谷滑动窗口队列queue

洛谷滑动窗口队列queue

洛谷 P1886 滑动窗口 /【模板】单调队列 

用数组que模拟双端队列(前后都可踢出元素)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <string>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <limits>
  8. #include <vector>
  9. #include <stack>
  10. #include <queue>
  11. #include <set>
  12. #include <map>
  13. #define INF 0x3f3f3f3f
  14. #define lowbit(x) x & (-x)
  15. using namespace std;
  16. typedef long long ll;
  17. typedef unsigned long long ull;
  18. const int maxN = 1e6 + 5;
  19. int n, k;
  20. int a[maxN];
  21. int que[maxN], id[maxN];
  22. int head, rear;
  23. void init()
  24. {
  25. head = 1;
  26. rear = 0;
  27. }
  28. int main()
  29. {
  30. while(~scanf("%d%d", &n, &k))
  31. {
  32. for(int i = 1; i <= n; i ++ )
  33. scanf("%d", &a[i]);
  34. //找区间最小值
  35. init();
  36. for(int i = 1; i <= n; i ++ )
  37. {
  38. while(head <= rear && que[rear] > a[i])//找到第一个小于a[i]的值的下标,如果没有就是head
  39. -- rear ;
  40. que[ ++ rear] = a[i];
  41. id[rear] = i;
  42. if(id[head] <= i - k)//保证最小元素是在长度范围内的也就是[i - len + 1, i]中的元素
  43. head ++;
  44. if(i >= k)//区间长度足够时就可以输出了。
  45. printf("%d ", que[head]);
  46. }
  47. putchar('\n');
  48. //找区间最大值
  49. init();
  50. for(int i = 1; i <= n; i ++ )
  51. {
  52. while(head <= rear && que[rear] < a[i])//找到第一个大于a[i]的值的下标,如果没有就是head
  53. -- rear ;
  54. que[ ++ rear] = a[i];
  55. id[rear] = i;
  56. if(id[head] <= i - k)
  57. head ++;
  58. if(i >= k)
  59. printf("%d ", que[head]);
  60. }
  61. putchar('\n');
  62. }
  63. return 0;
  64. }
  65. /*
  66. 7 3
  67. 7 8 -1 12 6 7 11
  68. */

 

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

闽ICP备14008679号