传送门: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.
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); } }
时间: 2024-10-25 07:47:54