//手写二分
ll n,x,ans;
int a[maxn];
int find1(int x)//找小于等于a[i]-C的数的函数
{
int l = 0,r = n+1,mid;
while(l+1 < r)
{
mid = (l+r)/2;
if(a[mid] <= x) l = mid;
else r = mid;
}
return l;
}
int find2(int x)//找小于a[i]-C的数的函数
{
int l = 0,r = n+1,mid;
while(l+1 < r)
{
mid = (l+r)/2;
if(a[mid] < x) l = mid;
else r = mid;
}
return l;
}
int main()
{
cin >> n >> x;
for(int i=1; i<=n; i++)
{
cin >> a[i];
}
sort(a+1,a+1+n);//用二分数组要有序
for(int i=1; i<=n; i++)
{
ans += find1(a[i]+x)-find2(a[i]+x);
//每次累加差,小于等于减去小于的是等于
}
cout << ans << endl;
return 0;
}
//STL
ll a[maxn];
ll n,c,ans;
int main() {
cin >> n >> c;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
sort(a+1,a+n+1);
for(int i=1; i<=n; i++) {
ans += ((upper_bound(a+1,a+n+1,a[i]+c)-a)-(lower_bound(a+1,a+n+1,a[i]+c)-a));
}
cout << ans << endl;
return 0;
}
洛谷 P1102 数对#二分
猜你喜欢
转载自blog.csdn.net/magic_wenge/article/details/105202207
今日推荐
周排行