读入整数到vector中,每次都固定最左边的位置,然后查找满足最条件的最右边的位置,中间的位置个数可进行排列组合,假如有nums个,则这种情况的解有nums*(nums-1)/2种情况。然后将最左边的位置向右移动一个继续统计,最右边的位置在满足条件的情况下需要进行更新,不需要从最左边的位置重新开始计算。参考了一个Python3版本的解。

#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

long long fun(const vector<long> vec, long dist)
{
    long long rst = 0;
    long n = vec.size();
    long right = 2;
    for(long i=0;i<n-2;i++)
    {
        long left = i;
        while(right < vec.size() && vec[right] - vec[left] <= dist)
        {
            right++;
        }

        if(right - left >= 3)
        {
            long nums = right-left-1;
            rst += nums * (nums -1)/2;
            rst %= 99997867;
        }
    }
    return rst;
}

int main()
{
    long n,dist;
    cin >> n >> dist;

    vector<long> m_vec;
    while(n--)
    {
        long a;
        cin >> a;
        m_vec.push_back(a);
    }

    cout << fun(m_vec,dist) << endl;
    return 0;
}