zoukankan      html  css  js  c++  java
  • 【重做】滑动窗口(单调队列)

    没什么特殊的,与以前的相比会条理一些吧。

     1 #include<bits/stdc++.h>
     2 #define rep(i,a,n) for(register int i = a;i <= n;++i)
     3 #define per(i,n,a) for(register int i = n;i <= a;--i)
     4 using namespace std;
     5 typedef long long ll;
     6 
     7 const int Maxn = 1e6+10;
     8 
     9 ll read(){
    10    ll a = 0;char c = getchar(),l = c;
    11    while(c < '0'||c > '9')l = c,c = getchar();
    12    while('0' <= c&&c <= '9')a = a*10+c-'0',c = getchar();
    13    if(l == '-')return -a;return a;
    14 }
    15 
    16 int n,k,ta,he,x;
    17 int a[Maxn];
    18 int qx[Maxn],qp[Maxn];
    19 
    20 int main(){
    21     n = read(),k = read();
    22     rep(i,1,n)a[i] = read();
    23     
    24     ta = he = Maxn>>1;
    25     rep(i,1,n){
    26         x = a[i];
    27         while(ta <= he)
    28             if(qx[ta] > x){if(++ta >= Maxn)ta = 0;}
    29             else break;
    30         while(ta <= he)
    31             if(i-qp[he] >= k){if(--he < 0)he = Maxn-1;}
    32             else break;
    33         if(--ta < 0)ta = Maxn-1;
    34         qx[ta] = x,qp[ta] = i;
    35         if(i >= k)printf("%d ",qx[he]);
    36     }
    37     puts("");
    38     
    39     ta = he = Maxn>>1;
    40     rep(i,1,n){
    41         x = a[i];
    42         while(ta <= he)
    43             if(qx[ta] < x){if(++ta >= Maxn)ta = 0;}
    44             else break;
    45         while(ta <= he)
    46             if(i-qp[he] >= k){if(--he < 0)he = Maxn-1;}
    47             else break;
    48         if(--ta < 0)ta = Maxn-1;
    49         qx[ta] = x,qp[ta] = i;
    50         if(i >= k)printf("%d ",qx[he]);
    51     }
    52     
    53 return 0;
    54 }

    2020 12 2

    受另一道题目的启发又想出了一种写法,实际上并不需要开循环队列,因为队首的移动方向是单一的。

     1 int qx[Maxn],qi[Maxn],a[Maxn];
     2 int n,m,he,ta;
     3 
     4 int main(){
     5     n = read(),m = read();
     6     rep(i,1,n)a[i] = read();
     7     
     8     he = 0,ta = -1;
     9     rep(i,1,n){
    10         while(he <= ta&&qx[ta] >= a[i])ta--;
    11         qx[++ta] = a[i],qi[ta] = i;
    12         while(he <= ta&&qi[he] <= i-m)he++;
    13         if(i >= m)printf("%d ",qx[he]);
    14     }
    15     puts("");
    16     
    17     he = 0,ta = -1;
    18     rep(i,1,n){
    19         while(he <= ta&&qx[ta] <= a[i])ta--;
    20         qx[++ta] = a[i],qi[ta] = i;
    21         while(he <= ta&&qi[he] <= i-m)he++;
    22         if(i >= m)printf("%d ",qx[he]);
    23     }
    24     
    25 return 0;
    26 }
  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/Wangsheng5/p/13934129.html
Copyright © 2011-2022 走看看