第一种做法:使用multiset
<span style="font-size:14px;"></span><pre name="code" class="cpp">#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<set>
#define ll long long
using namespace std;
multiset<ll> s;
multiset<ll> ::iterator it;
ll a[100100];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%I64d",&a[i]);
s.clear();
int l ,r;
l = r= 0;
ll ans = 0;
while(r<n)
{
s.insert(a[r++]);
while(*s.rbegin()-*s.begin()>=k)
{
it = s.find(a[l++]);
s.erase(it);
}
ans+=s.size();
}
cout<<ans<<endl;
}
return 0;
}
第二种
维护两个单调队列
<span style="font-size:14px;">#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include<iostream>
using namespace std ;
#define LL __int64
deque <LL> deq1 , deq2 ;
LL a[101000];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
LL k;
cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%I64d",&a[i]);
while(!deq1.empty()) deq1.pop_front();
while(!deq2.empty()) deq2.pop_front();
LL ans = 0;
int l,r;
l = r = 0;
while(r<n)
{
while(!deq1.empty()&&a[r]>deq1.back())
deq1.pop_back();
deq1.push_back(a[r]);
while(!deq2.empty()&&a[r]<deq2.back())
deq2.pop_back();
deq2.push_back(a[r]);
while(!deq1.empty()&&!deq2.empty()&&deq1.front()-deq2.front()>=k)
{
ans +=(r-l);
if(a[l]==deq1.front()) deq1.pop_front();
if(a[l]==deq2.front()) deq2.pop_front();
l++;
}
// cout<<ans<<endl;
r++;
}
while(l<n)
{
ans+=(r-l);
l++;
}
cout<<ans<<endl;
}
return 0;
}</span>