主要思路就是每读取一个数字,就判断窗口是否满足最大值减去最小值不大于距离D;
由于每次进行计算组合之后,窗口的begin都会往前移动一位,所以计算组合应该采用固定首位的方法,即固定首位有一人,接下来的位置的可能性,这样就可以保证窗口移动过程不会出现重复,因为下一次判断已经不包含上一个的首位置了。

#include <iostream> 
#include <vector>
using namespace std;

long long C(long long n) {
    return (n-1) * n / 2;
}

int main()
{
    int N, D; cin>> N >> D;
    long long count = 0;
    vector<int> res(N);
    for (int end = 0, begin = 0; end < N; end++) {
        cin>> res[end];
        while (end >= 2 && (res[end] - res[begin]) > D) {
            begin++;//不满足则begin往前移动
        }
        count += C(end - begin);//由于判断一次往前移动(for循环中的end++),即可以采用每次固定首位的组合。
    }
    cout << count % 99997867;
}