zoukankan      html  css  js  c++  java
  • 单调队列

    单调队列

    例题1

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

    ll n, k, cnt = 0;
    ll ans[2][1000005];
    
    struct node
    {
        ll sum, id;
    };
    
    deque<node> maxq;
    deque<node> minq;
    
    int main()
    {
        n = read();
        k = read();
        node t;
        for (int i = 1; i <= n; ++i)
        {
            ll x = read();
            t.id = i;
            t.sum = x;
            while (!minq.empty() && x <= minq.back().sum)
                minq.pop_back();
            while (!maxq.empty() && x >= maxq.back().sum)
                maxq.pop_back();
            minq.push_back(t);
            maxq.push_back(t);
            while (i - k >= minq.front().id)
                minq.pop_front();
            while (i - k >= maxq.front().id)
                maxq.pop_front();
            if (i >= k)
            {
                ans[0][++cnt] = minq.front().sum;
                ans[1][cnt] = maxq.front().sum;
            }
        }
        for (int i = 1; i <= n - k + 1; ++i)
            printf("%lld ", ans[0][i]);
        puts("");
        for (int i = 1; i <= n - k + 1; ++i)
            printf("%lld ", ans[1][i]);
    }
    

    例题2

    最大不定长子段和问题。

    在一段长为 \(n\) 的数列中,找出一个长度 \(≤m\) 的子段,使得它的和是最大的。子段长度不能为0。

    const ll maxn = 5000005;
    #define INF 9223372036854775800
    
    ll sum[maxn], q[maxn];
    ll n, m;
    
    int main()
    {
        n = read();
        m = read();
        for (int i = 1; i <= n; ++i)
        {
            ll x = read();
            sum[i] = sum[i - 1] + x;
        }
    
        ll h = 1, t = 1, ans = -INF;
        q[1] = 0;
        for (int i = 1; i <= n; ++i)
        {
            while (h <= t && q[h] < i - m)
                h++;
            ans = max(ans, sum[i] - sum[q[h]]);
            while (h <= t && sum[i] <= sum[q[t]])
                t--;
            q[++t] = i;
        }
        printf("%lld\n", ans);
        Edison Ba;
    }
    
  • 相关阅读:
    Ace
    微信公众平台模版消息
    微信智能开放平台
    微信公众平台运营规范
    微信公众平台开发(80) 上传下载多媒体文件
    .net上传文件夹的解决方案
    php上传文件夹的解决方案
    jsp上传文件夹的解决方案
    浏览器上传文件夹的解决方案
    网页上传文件夹的解决方案
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/14948573.html
Copyright © 2011-2022 走看看