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;
    }
    
  • 相关阅读:
    解决方案-文件管理系统:百科
    计算机:轮询
    公司-科技-安全狗:百科
    职位-金融:CFA(特许金融分析师)
    un-解决方案-BPM:百科
    un-协议-LDAP:百科
    引擎-搜索引擎-Java:ElasticSearch
    云-京东云:目录
    计算机:E-Learning
    Runoob-JSP:JSP 国际化
  • 原文地址:https://www.cnblogs.com/EdisonBa/p/14948573.html
Copyright © 2011-2022 走看看