题目描述
给定n个数,从中选出三个数,使得最大的那个减最小的那个的值小于等于d,问有多少种选法。
输入描述:
第一行两个整数n,d(1 <= n <= 100,000,1 <= d <= 1000,000,000);
第二行n个整数满足abs(ai) <= 1,000,000,000。数据保证a单调递增。
输出描述:
输出一个整数表示满足条件的选法。
示例1
输入
4 3 1 2 3 4
输出
4
简单的二分
AC:代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll v[maxn];
ll f(ll p){
ll s = 1;
s = p*(p-1)/2;
return s;
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(0);
ll n,m,sum = 0;
cin>>n>>m;
for(int i = 0;i<n;i++){
cin>>v[i];
}
for(int i = n-1;i>=0;i--){
int low = 0,high = i,mid;
while(high>low){
mid = low + (high - low)/2;
if(m>=(v[i] - v[mid])){
high = mid;
} else {
low = mid + 1;
}
}
if(i - mid >=2){
sum = sum + f(i - low);
}
}
printf("%lld
",sum);
return 0;
}