pairs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 702 Accepted Submission(s): 133
问题描述
John 在X轴上拥有 n 个点,他们的坐标分别为 (x[i],0),(i=0,1,2,…,n−1) 。 他想知道有多少对 <a,b> 满足 |x[b]−x[a]|≤k(a<b) 。
输入描述
第一行包含一个正整数 T (大约5),表示有多少组数据。 对于每一组数据,先读入两个数 n,k(1≤n≤100000,1≤k≤10 9 ) 。 接下来 n 行,分别输入 x[i](−10 9 ≤x[i]≤10 9 ,x[i] 为整数)。
输出描述
对于每组数据,输出一行表示有多少对 <a,b> 满足 |x[b]−x[a]|≤k 。
输入样例
2 5 5 -100 0 100 101 102 5 300 -100 0 100 101 102
输出样例
3 10
pairs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1073 Accepted Submission(s): 379
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≤10
9
)
.
Next n
lines contain an integer
x[i](−10
9
≤x[i]≤10
9
)
, means the X coordinates.
Each test case begins with two integers n,k(1≤n≤100000,1≤k≤10
Next n
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
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int T,n,k;
LL S[100000+10];
void PRI(int S[]) {
for(int i=0; i<n; i++) {
printf("[%d]\n",S[i]);
}
}
int main() {
//freopen("D://imput.txt","r",stdin);
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++) {
scanf("%I64d",&S[i]);
}
sort(S,S+n);
//PRI(S);
LL ret=0;
for(int i=1; i<n; i++) {
LL res=S[i]-k;
/*满足|x[b]−x[a]|≤k,
这个条件满足,不管x[b]>x[a],还是x[a]>x[b],
从一组数组中任意取两个数他们的下标都有大小关系。(建议自己演算一下)
所以只要先排序一下,然后选择一个,然后选择一个比他小的并且满足条件的。
设他们为x[a1],x[a2],并且x[a1]<x[a2](不管a1<a2还是a2<a1,他们都满足|x[b]−x[a]|≤k)。
如此用二分法查找即可。
*/
ret+=lower_bound(S,S+i,0x3f3f3f3f)-lower_bound(S,S+i,res);
}
printf("%I64d\n",ret);
}
return 0;
}