[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;
}
原文地址:https://www.cnblogs.com/mollnn/p/14404003.html