需要用到一点组合的知识。
这问题可以设一个游标end.end从左到右滑动。每次滑动。针对每次滑动,求组合次数。
这里有两个技巧。
当我们取一个end的值之后,可以从前往后的找到第一个让p[end]-p[start]<D的start的值。因为是三个人,而求解的时候,end锁定。所有只需要确定两个人的位置。因为是顺序表。所以从start(包含)到end(不包含)中间的2个点的组合都成立。所以是c(end-start)2。cn2的组合式展开是n*(n-1)/2.
这里的另一个技巧是。当end变时。end的距离更加远了,所以start也不可能小于上一次的取值。因为start可以从上一次取值开始。而并不需要从0 开始计算。
100 | 200 | 300 | 400 |
|
start | end |
|
|
N,D =map(int,input().split(' '));
p=list(map(int,input().split(' ')))total=0
start=0;
for end in range(2,N):
while (p[end]-p[start]>D):
start=start+1;
num=(end-start);
total=total+num*(num-1)//2
print(total%99997867)