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.
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.
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.
4 3
1 2 3 4
4
4 2
-3 -2 -1 0
2
5 19
1 10 20 30 50
1
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}.
#include <iostream>
#include <cstdio>
#include <algorithm>
typedef long long ll;
using namespace std;
ll a[100005];
ll C(ll x,ll y){
if(x<y) return 0;
ll sum=1;
for(int i=x,j=1;j<=y;i--,j++)
sum=sum*i/j;
return sum;
}
int main(){
ll n,d,ans;
while(cin>>n>>d){
for(int i=1;i<=n;i++) cin>>a[i];
ans=0;
for(int i=1;i<=n-2;i++){
ll tep=a[i]+d,tmp;
int l=i,r=n,mid;
while(l<=r){
mid=(l+r)>>1;
if(a[mid]<=tep) l=mid+1,tmp=mid;
else r=mid-1;
}
ans+=C(tmp-i,2);
}
cout<<ans<<endl;
}
return 0;
}
本文介绍了一个算法问题:在一条OX线上选择n个点,找出所有可能的三元组点集合,使得这三点中任意两点间的最大距离不超过给定值d。通过输入n个点的坐标并利用滑动窗口和组合数学技巧,文章提供了一种有效的方法来解决这个问题。
589

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



