当前位置:   article > 正文

洛谷【P1886】滑动窗口

洛谷p1886

浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html

题目传送门:https://www.luogu.org/problemnew/show/P1886

扫两遍,单调队列维护最值即可。

时间复杂度:O(n)

空间复杂度:O(n)

代码如下:

  1. #include <cstdio>
  2. using namespace std;
  3. const int maxn=1e6+5;
  4. int n,k,head,tail;
  5. int a[maxn],list[maxn];
  6. int read() {
  7. int x=0,f=1;char ch=getchar();
  8. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  9. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
  10. return x*f;
  11. }
  12. int main() {
  13. n=read(),k=read();
  14. for(int i=1;i<=n;i++)
  15. a[i]=read();
  16. for(int i=1;i<=k;i++) {
  17. while(tail!=head&&a[list[tail-1]]>a[i])tail--;
  18. list[tail++]=i;
  19. }
  20. printf("%d ",a[list[head]]);
  21. for(int i=k+1;i<=n;i++) {
  22. while(tail!=head&&a[list[tail-1]]>a[i])tail--;
  23. list[tail++]=i;
  24. while(tail!=head&&i-list[head]>=k)head++;
  25. printf("%d ",a[list[head]]);
  26. }puts("");head=tail=0;
  27. for(int i=1;i<=k;i++) {
  28. while(tail!=head&&a[list[tail-1]]<a[i])tail--;
  29. list[tail++]=i;
  30. }
  31. printf("%d ",a[list[head]]);
  32. for(int i=k+1;i<=n;i++) {
  33. while(tail!=head&&a[list[tail-1]]<a[i])tail--;
  34. list[tail++]=i;
  35. while(tail!=head&&i-list[head]>=k)head++;
  36. printf("%d ",a[list[head]]);
  37. }
  38. return 0;
  39. }

转载于:https://www.cnblogs.com/AKMer/p/10315859.html

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

闽ICP备14008679号