题目描述
给定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; }