#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
int n,m;
int a[100010];
int stmax[100010][20],stmin[100010][20];
using namespace std;
void init()
{
for (int i = 0 ; i < n ;i++)
stmax[i][0] = a[i],stmin[i][0] = a[i];
for(int i = n-1 ; i>= 0 ;i--)
{
for (int j =1 ; i+(1 << j)-1 < n;j++)
{
stmax[i][j] = max(stmax[i][j-1],stmax[i+(1 << j-1)][j-1]);
stmin[i][j] = min(stmin[i][j-1],stmin[i+(1 << j-1)][j-1]);
}
}
}
int qur(int l,int r)
{
int k = (int )floor(log2(r-l+1));
return max(stmax[l][k],stmax[r-(1<<k)+1][k]) - min(stmin[l][k],stmin[r-(1<<k)+1][k]);
}
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> n >> m;
for (int i = 0 ; i < n ;i++)
scanf("%d",&a[i]);
init();
long long ans = 0;
for (int i = 0 ; i < n ;i++)
{
int l = i , r = n-1;
long long cnt = 0;
// for(int j=0;j<n-1;j++){
// for(int k=j;k<n;k++)
// printf("%d ",qur(j,k));
// printf("\n");
// }
while(l <= r)
{
int mid=(l+r)>>1;
if(qur(i,mid) < m)
cnt = mid,l = mid+1;
else
r = mid-1;
}
ans += cnt-i+1;
}
cout << ans <<endl;
}
}
st表
最新推荐文章于 2024-04-16 14:21:38 发布