HDU 5172 pairs
2015-08-15 21:39
405 查看
HDU 5172 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−x[a]|≤k.(a<b)
[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−x[a]|≤k.
[b]Sample Input
2
5 5
-100
0
100
101
102
5 300
-100
0
100
101
102
Sample Output
3
10
题意:判断有多少数满足|x[b]−x[a]|≤k.(a<b)
注意:(1≤n≤100000,1≤k≤109).数据过多,暴力计算会TLE
首先对数组按升序排序
用一个数组pos[i]记录x[i]右边最远的x[b]的b值,由于x[b]是单调递增的,所以找pos[i+1]时只要将b从pos[i]继续往右找即可。
另外答案结果非常大,应用long long来保存
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−x[a]|≤k.(a<b)
[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−x[a]|≤k.
[b]Sample Input
2
5 5
-100
0
100
101
102
5 300
-100
0
100
101
102
Sample Output
3
10
题意:判断有多少数满足|x[b]−x[a]|≤k.(a<b)
注意:(1≤n≤100000,1≤k≤109).数据过多,暴力计算会TLE
首先对数组按升序排序
用一个数组pos[i]记录x[i]右边最远的x[b]的b值,由于x[b]是单调递增的,所以找pos[i+1]时只要将b从pos[i]继续往右找即可。
另外答案结果非常大,应用long long来保存
[code]#include<cstdio> #include <iostream> #include<algorithm> #include <string.h> #define N 100200 using namespace std; long a , p ; int main() { #ifndef ONLINE_JUDGE freopen("1.txt", "r", stdin); #endif int T; long n, k, i, j; long long ans; cin >> T; while(T--) { ans = 0; memset(p, 0, sizeof(p)); cin >> n >> k; for (i = 0; i < n; i++) { cin >> a[i]; } sort(a, a+n); for(i = 0; i < n; i++) { if (i) { for(j = p[i - 1]; j <= n; j++) { if ((j < n && a[j] > a[i] + k) || (j == n)) { p[i] = j - 1; ans += j - i - 1; break; } } } else { for (j = i + 1; j <= n; j++) { if ((j < n && a[j] > a[i] + k) || (j == n)) { p[i] = j - 1; ans += j - i - 1; break; } } } } cout << ans << endl; } return 0; }
相关文章推荐
- UVa10986_Sending email(最短)(白皮书图论的话题)
- yuanzisaima-C
- HDU 2473-Junk-Mail Filter-并查集删除
- PAT 1079. Total Sales of Supply Chain (25)
- hit2060 Fibonacci Problem Again
- select系统调用源码分析 http://blog.csdn.net/martin_liang/article/details/9124911
- Known plaintext attack
- Clairewd’s message - HDU 4300(next[]运用)
- Grails WEB层 Groovy Server Pages
- 浅析_tmain()与main()的区别
- 2015 HUAS Summer Trainning #5~G
- HDOJ-1787 GCD Again(欧拉函数)
- HDU 1151 Air Raid( 最小路径覆盖)
- HDU Train Problem II (卡特兰数+大数)
- hdu 2389 Rain on your Parade (HK)
- UVA 10494-If We Were a Child Again(一流的塔尔苏斯)
- 2015 HUAS Summer Trainning #5 A
- AIDL进程间传递复杂数据类型—AIDL传递其他AIDL接口
- Could not find action or result: /SendMail/servlet/UploadServlet
- 简易智能自动问答机器人