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 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

 题意:给定一个数组,求有多少对<a,b>使得|x[b]−x[a]|≤k.(a<b)

思路:1、这道题最重要的就是要解决超时这个问题,否则按暴力肯定是超时的。

        2、解决超时,这里有种方法。

            先将这个数组从小到大排序,然后i从0开始,tmp从0开始判断,如果值小于等于k的话,tmp++,直到>k停止,

            ans加上该值。下一次,i+1,之前的i和k可以,那么和i+1更可以,所有k继续向后跑,如此复杂度大大减少。

           具体看代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<cmath>
 7 using namespace std;
 8 #define N 100006
 9 #define ll long long
10 int n,k;
11 int a[N];
12 int main()
13 {
14     int t;
15     scanf("%d",&t);
16     while(t--)
17     {
18         scanf("%d%d",&n,&k);
19         for(int i=0;i<n;i++) scanf("%d",&a[i]);
20         sort(a,a+n);
21         ll ans=0;
22         int tmp=0;
23         for(int i=0;i<n;i++)
24         {
25             while(abs(a[i]-a[tmp])<=k && tmp<n ) tmp++;
26             ans=ans+tmp-i-1;
27         }
28         printf("%I64d\n",ans);
29     }
30     return 0;
31 }

时间: 2024-10-23 09:44:05

hdu 5178 pairs (线性探查问题)的相关文章

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,

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(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

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("

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 5178(二分-lower_bound,upper_bound)

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

hdu 5178想法题

比赛时,想法是:固定位置b,然后在b前面找大小处于[x[b] - k, x[b] + k]的数字个数,最后在加起来就是结果,但是要动态的维护b之前的数自动从小到大排序,每次都会新添加一个数,可以用二分插入,但是往后移动的数太多,直接就tle了. 后来的想法是:把原题等价转化一下,先把数据排序,然后对于当前位置i,找到左边的第一个>= x[i] - k的位置pos,则结果就是所有i - pos 的和. 原因是:排序后,x[b] - x[a] <= k, b > a. 讨论:b未排序的位置

Bestcoder Round #31

hdu 5178 求|a[i] - a[j]| <= k (i < j) <i,j>的对数,一开始认为数据不大就直接ans++了,后来结果出来才知道,啊啊啊,too young too simple.总之一个教训 思路:先排序,然后用二分查找寻找a[i] + k 在数组中的位置,然后 ans相加 #include <iostream> #include <cstdio> #include <cmath> #include <cstring&