zoukankan      html  css  js  c++  java
  • [CF6E] Exposition

    ## [CF6E] Exposition - 双指针
    
    ### Description
    
    给一个 n 个元素的序列,从中挑出最长的子串,要求子串中元素差的最大值不超过 k。问有几个最长子串,子串长度,以及这几个子序起始、终止位置。
    
    ### Solution
    
    双指针,控制右端点,左端点移动到保证内部元素差的最大值不超过 k 即可
    
    ``` cpp
    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int n, k;
        cin >> n >> k;
    
        vector<int> a(n + 2);
        for (int i = 1; i <= n; i++)
            cin >> a[i];
    
        vector<pair<int, int>> ans_pos;
        int ans = 0;
    
        multiset<int> s;
        int j = 1;
        for (int i = 1; i <= n; i++)
        {
            s.insert(a[i]);
            while (*s.rbegin() - *s.begin() > k)
                s.erase(s.find(a[j++]));
            if (i - j + 1 > ans)
            {
                ans = i - j + 1;
                ans_pos = {{j, i}};
            }
            else if (i - j + 1 == ans)
            {
                ans_pos.push_back({j, i});
            }
        }
    
        cout << ans << " " << ans_pos.size() << endl;
        for (auto [x, y] : ans_pos)
            cout << x << " " << y << endl;
    }
    
  • 相关阅读:
    大于00
    today
    10
    面试题flask
    开发者日志
    7月22日一天学的东西
    资料
    3333
    2222
    1
  • 原文地址:https://www.cnblogs.com/mollnn/p/14404003.html
Copyright © 2011-2022 走看看