zoukankan      html  css  js  c++  java
  • 洛谷 P1886 滑动窗口 (单调队列)

    题目

    有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

    思路

    维护一个单调队列即可。

    代码实现

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define rep(i,f_start,f_end) for (int i=f_start;i<=f_end;++i)
    #define per(i,n,a) for (int i=n;i>=a;i--)
    #define MT(x,i) memset(x,i,sizeof(x) )
    #define rev(i,start,end) for (int i=0;i<end;i++)
    #define inf 0x3f3f3f3f
    #define mp(x,y) make_pair(x,y)
    #define lowbit(x) (x&-x)
    #define MOD 1000000007
    #define exp 1e-8
    #define N 1000005 
    #define fi first 
    #define se second
    #define pb push_back
    typedef long long ll;
    typedef pair<int ,int> PII;
    ll gcd (ll a,ll b) {return b?gcd (b,a%b):a; }
    inline int read() {
        char ch=getchar(); int x=0, f=1;
        while(ch<'0'||ch>'9') {
            if(ch=='-') f = -1;
            ch=getchar();
        } 
        while('0'<=ch&&ch<='9') {
            x=x*10+ch-'0';
            ch=getchar();
        }   return x*f;
    }
    
    struct node {
        static const int maxn=1000001;
        int n,k,a[maxn];
        int p[maxn],q[maxn];
        int head,tail;
    
        void rea () {
          scanf ("%d %d",&n,&k);
          rep (i,1,n) scanf ("%d",&a[i]);
        }
    
        void queue_max () {
            head=1;
            tail=0;
            rep (i,1,n) {
                while (head<=tail&&q[tail]<=a[i]) tail--;
                q[++tail]=a[i];
                p[tail]=i;
                while (p[head]<=i-k) head++;
                if (i>=k) printf ("%d ",q[head]);
            }
            cout<<endl;
        }
    
        void queue_min () {
            head=1;
            tail=0;
            rep (i,1,n) {
                while (head<=tail&&q[tail]>=a[i]) tail--;
                q[++tail]=a[i];
                p[tail]=i;
                while (p[head]<=i-k) head++;
                if (i>=k) printf ("%d ",q[head]);
            }
            printf ("
    ");
        }
    }solve;
    
    int main () {
    //    freopen ("data.in","r",stdin);
       solve.rea ();
       solve.queue_min();
       solve.queue_max ();
    //    fclose (stdin);
       return 0;
    }
    
    
  • 相关阅读:
    根据访问ip的地区跳转到指定地址
    js生成vCard,以及格式参数详细说明
    min_to_split_multiprocessing多进程,用于平时快速补充数据
    min_to_split.py按日存储到按个股存储
    readzip_minute_data 多进程处理数据
    打包成7zfile,to7zfile
    baostock_multiprocessing 多进程取数据
    终止阻塞线程(有共享锁的线程无效)
    readzip_add_maxL3多线程
    readzip_add_maxL2
  • 原文地址:https://www.cnblogs.com/hhlya/p/13455003.html
Copyright © 2011-2022 走看看