分析:
维护两个单调队列 单调增和单调减 这样就可以维护以
i
i
i 结尾的最长合法子序列
这段合法的小子序列个数 即这个最长序列的长度
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=5e4+5;
int n,k,a[N],ans,tmp;
deque<int> q,q2;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
while(!q.empty()&&a[i]>a[q.back()]) q.pop_back();
q.push_back(i);
while(!q2.empty()&&a[i]<a[q2.back()]) q2.pop_back();
q2.push_back(i);
while(a[q.front()]-a[q2.front()]>k)
{
tmp=min(q.front(),q2.front());
(q.front()<q2.front())?q.pop_front():q2.pop_front();
}
ans+=i-tmp;
}
printf("%d",ans);
return 0;
}