题目:
有一个长度为n的序列,现在问你子串内元素之差不超过k的原序列的子串长度最长为多少,如果有多个同样长度的答案,请输出所有子串的起点和终点下标。
解决:
滑动窗口,用set搞,学到了学到了
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, k;
int a[N];
multiset<int> s;
vector<pair<int, int> > v;
int main()
{
cin >> n >> k;
int l = 1;
int len = 0;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
s.insert(a[i]);
while (*s.rbegin() - *s.begin() > k) // 最大值-最小值差距大于k,要不断删掉左端点
{
// cout << *s.rbegin() << " " << *s.begin() << " " << (*s.rbegin(), *s.begin())<< endl;
// s.erase(a[l ++ ]);
s.erase(s.find(a[l]));
l ++;
}
// cout << s.size() << endl;
// cout << l << " " << i << endl;
// 如果长度大于了,就将所有存的都删掉
if (len < i - l + 1)
{
v.clear();
v.push_back({l, i});
len = i - l + 1;
}
else if (len == i - l + 1)//
{
v.push_back({l, i});
}
}
cout << len << " " << v.size() << endl;
for (auto it : v)
{
printf("%d %d\n", it.first, it.second);
}
return 0;
}