RMQ + 二分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN = 100000;
const int MAXE = 25;
//const int MAX = 30;
int n;
int m;
int h[MAXN];
//int bin[MAX];
//int Log[MAXN]
int mmax[MAXN][MAXE];
int mmin[MAXN][MAXE];
void RMQ_ST()
{
for(int i = 1; i <= n; i++)
{
mmax[i][0] = h[i];
mmin[i][0] = h[i];
}
int end_j = log(n + 0.0) / log(2.0);
int end_i;
for(int j = 1; j <= end_j; j++)
{
end_i = n + 1 - (1 << j);
for(int i = 1; i <= end_i; i++)
{
mmax[i][j] = max(mmax[i][j - 1], mmax[i + (1 << (j - 1))][j - 1]);
mmin[i][j] = min(mmin[i][j - 1], mmin[i + ( 1 << (j - 1))][j -1]);
}
}
}
int QueryMax(int l, int r)
{
int k = log(r - l + 1.0) / log(2.0);
int x = max(mmax[l][k], mmax[r - (1 << k) + 1][k]);
int y = min(mmin[l][k], mmin[r - (1 << k) + 1][k]);
return x - y;
}
//int QueryMin(int l, int r)
//{
// int k = log(r - l + 1.0) / log(2.0);
// return min(mmin[l][k], mmin[r - (1 << k) + 1][k]);
//}
int main()
{
int T;
cin >> T;
while(T--)
{
int k;
cin >> n >> k;
for(int i = 1; i <= n; i++)
{
cin >> h[i];
}
RMQ_ST();
int l,r;
// cin >> m;
// for(int i = 1; i <= m; i++)
// {
// cin >> l >> r;
// cout << QueryMax(l,r) << endl;
// }
long long int ans = 0;
for(int i = 1; i <= n; i++)
{
l = i;
r = n;
while(l <= r)
{
int mid = (l + r) / 2;
int cha = QueryMax(i,mid);
if(cha < k)
{
l = mid + 1;
}
else r = mid - 1;
}
ans += l - i;
}
cout << ans << endl;
}
return 0;
}