题意:问一个序列中有多少个子序列,其最大值与最小值的差小于k
方法:用单调队列解,用两个deque,q1单调递增,q2单调递减
#include <stdio.h>
#include <deque>
#define maxn 100005
using namespace std;
int a[maxn];
int f(int n)
{
return (n + n * (n - 1) / 2);
}
int main()
{
int l, r, t, n, k, i;
long long int ans;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &k);
deque<int> q1;
deque<int> q2;
for(i = 1;i <= n;i++) scanf("%d", &a[i]);
l = r = 1;
ans = 0;
while(r <= n)
{
while(!q1.empty()&&a[r] < q1.back()) q1.pop_back();
q1.push_back(a[r]);
while(!q2.empty()&&a[r] > q2.back()) q2.pop_back();
q2.push_back(a[r]);
while(!q1.empty()&&!q2.empty()&&q2.front() - q1.front() >= k)
{
if(q1.front() == a[l]) q1.pop_front();
if(q2.front() == a[l]) q2.pop_front();
l++;
}
ans += (r - l + 1);
r++;
}
printf("%I64d\n", ans);
}
}