pairs HDU - 5178 (二分)

John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,…,n−1). He wants to know how many pairs<a,b> that |x[b]−x[a]|≤k.(a<b)
Input
The first line contains a single integer T (about 5), indicating the number of cases.
Each test case begins with two integers n,k(1≤n≤100000,1≤k≤109).
Next n lines contain an integer xi, means the X coordinates.
Output
For each case, output an integer means how many pairs<a,b> that |x[b]−x[a]|≤k.
Sample Input
2
5 5
-100
0
100
101
102
5 300
-100
0
100
101
102
Sample Output
3
10

题意:

给你n个在x轴上的坐标的横坐标值(实际上就是给你一个数列);
然后让你判断里面有多少种组合满足 | x[ b ]- x [ a ] | <= k

思路:
很显然不能使用两重循环,先排序,对于每一个坐标,向右找到最右的而且满足条件的位置,那么这点的答案为两点之间的所有点,对于找点,二分可得

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxx=1e5+7;
#define INF 0x3f3f3f
int a[maxx];
int main()
{
    int t;
    cin >>t;
    while(t--)
    {
        int n,k,cot=0;
        cin >>n>>k;
        for(int i=0;i<n;i++)
            cin >>a[i];
        sort(a,a+n);
        ll sum=0;
        for(int i=0;i<n;i++)
        {
            int l=i+1,r=n-1,mid;
            while(l<=r)
            {
                mid=(r-l)/2+l;
                if(abs(a[mid]-a[i])<=k)
                    l=mid+1;
                else r=mid-1;
            }
            sum+=l-i-1;
        }
        cout <<sum<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值