## [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;
}