求值(二分)

题目描述 

给定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\n",sum);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acer12138/article/details/80138723