码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5178 pairs 二分

时间:2015-03-01 17:08:08      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:hdu   bestcoder   

传送门: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(1n100000,1k109).
Next n lines contain an integer x[i](?109x[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);
	}
} 

HDU 5178 pairs 二分

标签:hdu   bestcoder   

原文地址:http://blog.csdn.net/haoliang94/article/details/44003361

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!