HDU 5178:pairs(二分,lower_bound和upper_bound)

                                                  pairs

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4157    Accepted Submission(s): 1481

Problem Description

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 x[i](−109≤x[i]≤109), 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

 

题意

有x个数,求出这x个数中有多少对数相减的绝对值小于等于k

思路

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
int a[maxn];
int main(int argc, char const *argv[])
{
	ios::sync_with_stdio(false);
	int t;
	int n,k;
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		for (int i = 1; i <=n; ++i)
		{
			cin>>a[i];
		}
		sort(a+1,a+n+1);
		ll ans=0;
		for(int i=1;i<=n;i++)
		{
			int l=lower_bound(a+1+i,a+1+n,a[i]-k)-a-1;
			int r=upper_bound(a+i+1,a+1+n,a[i]+k)-a-1;
			ans+=r-l;
		}
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_123_zy/article/details/81263381