John has nn points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,…,n−1)(x[i],0),(i=0,1,2,…,n−1). He wants to know how many pairs<a,b><a,b>that |x[b]−x[a]|≤k.(a<b)|x[b]−x[a]|≤k.(a<b)
Input
The first line contains a single integer TT (about 5), indicating the number of cases.
Each test case begins with two integers n,k(1≤n≤100000,1≤k≤109)n,k(1≤n≤100000,1≤k≤109).
Next nn lines contain an integer x[i](−109≤x[i]≤109)x[i](−109≤x[i]≤109), means the X coordinates.
Output
For each case, output an integer means how many pairs<a,b><a,b> that |x[b]−x[a]|≤k|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
先排序之后,枚举j,j从上次的下界开始,接着就是累加(j-i)
baoli过不去
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
const int maxx=1000066;
typedef long long LL;
LL a[maxx];
int main(){
LL n,t,k;
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n);//从小到大排序;
LL ans=0,i,j=0;
for(i=0;i<n;i++){//尺取法
while(j+1<n&&a[j+1]-a[i]<=k) j++;
ans=ans+(j-i);//曾经的j肯定行,所以从上次的j开始枚举就可以
}
printf("%lld\n",ans);
}
return 0;
}