给定一个序列,让你求出最长的连续序列,要求序列中最大值减最小值<k,问有多少个这样的序列;
没想出来,看了看题解,multiset+vector 可以来一波;
用multiset维护现有序列的有序性,一旦最大值-最小值>k,按输入顺序一直删除到最小值就ok
AC代码
#include <iostream>
#include <string.h>
#include <algorithm>
#include <set>
#include <vector>
#define STD std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=1e5+10;
multiset<int>s;
vector< pair<int,int> > v;
int a[inf];
int main()
{
STD;
int n,k;
cin>>n>>k;
int po=1;
int maxn=0;
for (int i=1;i<=n;i++)
{
cin>>a[i];
s.insert(a[i]);
while(*s.rbegin()-*s.begin()>k)
{
s.erase(s.find(a[po]));
po++;
}
if (i-po+1>maxn)
{
maxn=i-po+1;
v.clear();
v.push_back(make_pair(po,i));
}
else if (i-po+1==maxn)
v.push_back(make_pair(po,i));
}
cout<<maxn<<" "<<v.size()<<endl;
for (int i=0;i<v.size();i++)
cout<<v[i].first<<" "<<v[i].second<<endl;
return 0;
}