pairs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3354 Accepted Submission(s): 1191
Total Submission(s): 3354 Accepted Submission(s): 1191
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.
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
题意:有n个数组成的序列,问有多少个点对满足|x[b]−x[a]|≤k.(a<b)
思路:这个a<b就是来迷惑你的,其实就是点对不能反着来就是了。 那么我们可以枚举前面一个点,然后根据
x[a]-k<=x[b]<=x[a]+k 从a的下一个编号开始找即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 100050
int a[N];
int main()
{
int T, n, k;
cin >> T;
while (T--)
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
long long ans = 0;
for (int i = 1; i <= n; i++)
{
int l = lower_bound(a + i + 1, a + 1 + n, a[i] - k) - a - 1;
int r = upper_bound(a + i + 1, a + 1 + n, a[i] + k) - a - 1;
ans = ans + r - l;
}
cout << ans << endl;
}
return 0;
}