传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5178
pairs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 320 Accepted Submission(s): 143
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
Source
题目给你N个点。问有多少对点的长度小于K
先快排。然后二分。。开始的时候没想到二分。。于是TLE了。。
后面没用lld 又WA了几次=。=这题真悲催。。
代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#define INF 0x0f0f0f0f
using namespace std;
int main()
{
long long int i,j,k,l,r,n,t,m,mid;
long long int a[100005];
scanf("%d",&t);
while(t--)
{
long long int ans=0;
scanf("%I64d%I64d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
}
sort(a,a+n);
r=1;
for(i=0;i<n;i++)
{
l=i+1;
r=n-1;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]-a[i]>k) r=mid-1;
else l=mid+1;
}
ans=ans+r-i;
}
printf("%I64d\n",ans);
}
}