题目链接: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): 3090    Accepted Submission(s): 1085

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


题解:

两个要求:1:b>a   2.abs(x[b]-x[a])<=k。

先对数组进行排序。对于满足上述条件的a、b(ab为排序前的序号)来说。a、b的关系是可以互相转化的:

当abs(x[b]-x[a])<=k 且 b>a时,那这一对a、b固然满足条件。

当abs(x[b]-x[a])<=k 且 a>b时,那a就变成b,b就变成a,所以也满足条件。

综上,只需要找到abs(x[b]-x[a])<=k 的a、b对即可,无所谓ab的大小关系。但是直接这样计算会出现重复,正确的做法是,只取一边,即:x[a]+k或者是 x[a]-k,这样就能避免重复。

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define rep(i,s,t) for(int (i)=(s); (i)<=(t); (i)++)
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const double eps = 1e-;
const int mod = 1e9+;
const int maxn = 1e5+; int n, k;
int a[maxn]; int sch(int x)
{
int l = , r = n;
while(l<=r)
{
int mid = (l+r)>>;
if(a[mid]<=x)
l = mid + ;
else
r = mid - ;
}
return r;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
rep(i,,n)
scanf("%d",&a[i]); sort(a+,a++n);
LL ans = ;
rep(i,,n-)
{
int p = sch(a[i]+k);
// int p = upper_bound(a+1,a+1+n,a[i]+k) - (a+1);
ans += p-i;
}
printf("%I64d\n",ans);
}
}

最新文章

  1. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用
  2. Java 理论与实践: 正确使用 Volatile 变量
  3. 什么是元数据(Metadata)?
  4. POJ 3304 Segments (直线和线段相交判断)
  5. C#_判断2个对象的值是否相等
  6. ###学习《C++ Primer》- 4
  7. c#简单的Json解析类
  8. 8-10-Exercise
  9. Html5 Canvas Text
  10. 浅谈对JIT编译器的理解。
  11. 进阶笔记(2)——JavaScript语言精碎
  12. VC断点不可用的问题
  13. jTDS驱动兼容性问题
  14. flex 布局实现固定头部和底部,中间滚动布局
  15. Java基础2:基本数据类型与常量池
  16. Nginx代理MysqlCluster集群
  17. Android组件系列----Intent详解
  18. 使用Topshelf管理Windows服务
  19. LeetCode(35):搜索插入位置
  20. 跟厂长学PHP7内核(四):生命周期之开始前的躁动

热门文章

  1. 使用sudo,mvn command not found
  2. leetcode 331. Verify Preorder Serialization of a Binary Tree
  3. Linux 下tomcat的配置
  4. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
  5. sring-&gt;list-&gt;del-&gt;string-&gt;int:解析左右编码器的,和#号
  6. 算法笔记字符串处理问题H:编排字符串(2064)
  7. 将文件从已Root Android手机中copy出来的几个cmd窗口命令
  8. Ubuntu 16.04安装CrossOver容器来安装QQ(终极解决办法,亲测有效)
  9. Thrift --- 支持双向通信
  10. 使用图片作为textview组件的背景