主要思路就是每读取一个数字,就判断窗口是否满足最大值减去最小值不大于距离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;
}


京公网安备 11010502036488号