Points on Line
Description
Little Petya likes points a lot. Recently his mom has presented him n points lying on the line OX. Now Petya is wondering in how many ways he can choose three distinct points so that the distance between the two farthest of them doesn't exceed d.
Note that the order of the points inside the group of three chosen points doesn't matter.
Input
The first line contains two integers: n and d (1 ≤ n ≤ 105; 1 ≤ d ≤ 109). The next line contains n integers x1, x2, ..., xn, their absolute value doesn't exceed 109 — the x-coordinates of the points that Petya has got.
It is guaranteed that the coordinates of the points in the input strictly increase.
Output
Print a single integer — the number of groups of three points, where the distance between two farthest points doesn't exceed d.
Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Sample Input
4 3
1 2 3 4
4
4 2
-3 -2 -1 0
2
5 19
1 10 20 30 50
1
Hint
In the first sample any group of three points meets our conditions.
In the seconds sample only 2 groups of three points meet our conditions: {-3, -2, -1} and {-2, -1, 0}.
In the third sample only one group does: {1, 10, 20}.
#include <algorithm>
#include <stdio.h>
using namespace std;
#define N 100100
int num[N];
int main()
{
long long m,n,t,i,sum=0;
scanf("%lld %lld",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
for(i=0;i<n-2;i++)
{
t=upper_bound(num,num+n,num[i]+m)-num;
sum+=(t-i-1)*(t-i-2)/2;//排列组合化简,下标为t-i-1,上标为2,算C
}
printf("%lld",sum);
return 0;
}

本文介绍了一个编程问题,即如何计算在一条直线上选择三个点的所有可能组合,使得最远两点间的距离不超过给定值d。文章提供了一段C++代码示例,用于解决这个问题,并通过样本输入展示了预期的输出结果。

440

被折叠的 条评论
为什么被折叠?



