HDU 5178 pairs 二分

传送门: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

BestCoder Round #31

题目给你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

HDU 5178 pairs 二分的相关文章

HDU 5178 pairs【二分】||【尺取】

<题目链接> 题目大意: 给定一个整数序列,求出绝对值小于等于k的有序对个数. 解题分析: $O(nlong(n))$的二分很好写,这里就不解释了.本题尺取$O(n)$也能做,并且效率很不错. 尺取: #include <bits/stdc++.h> using namespace std; int arr[int(1e5+5)]; int main(){ int T,n,k;scanf("%d",&T); while(T--){ scanf("

HDU 5178 Pairs

pairs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 96    Accepted Submission(s): 38 Problem Description John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,…,n−1). He

hdu 5178 pairs (线性探查问题)

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 numb

hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)

题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100005]; int main(){ cin>>T; while(T--){ cin>>n>>k; rep(i,1,n) scanf("%d",&x[i]); sort(x+1,x+1+n); ll ans=0; rep(i,2,n){ ll te

STL之二分查找:hdu 5178 ( BestCoder Round #31 1001 )

STL包含四种不同的二分查找算法,binary_search    lower_bound  upper_bound   equal_range.他们的作用域是已经排序好的的数组. ★binary_search试图在已排序的[first, last)中寻找元素value.如果找到它会返回true,否则返回false,它不返回查找位置. ★iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素. ★iterat

hdu 5178

pairs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1056    Accepted Submission(s): 372 Problem Description John has n points on the X axis, and their coordinates are (x[i],0),(i=0,1,2,-,n?1)

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

HDU 4768 Flyer (二分)

OJ题目:click here~~ 题目分析:n个[a  b] 区间,对于i 属于[a  b]  ,从a开始,间隔c ,即i = a , i = a + c , i = a + 2*c -- 将x[ i ] 加1 ,x[ i ] 初值为0 . 已知最多只有一个x[ i ] 为奇数.找到这个i , 和这个奇数. 由于最多只有一个奇数,且奇数 + 偶数 = 奇数.用二分夹逼出这个奇数的位置.找到这个位置,再计算这个奇数就很容易了. AC_CODE const int maxn = 20002; LL