题目描述:

Match Points

time limit per test

2 seconds

memory limit per test

256 mega bytes

input

standard input

output

standard output

You are given a set of points x1, , ..., x**n

Two points iand jcan be matched with each other if the following conditions hold:

  • neither i nor j is matched with any other point;
  • |x**ix**j|≥z.

What is the maximum number of pairs of points you can match with each other?

Input

The first line contains two integers n

and (2≤n≤2⋅105) — the number of points and the constraint on the distance between matched points, respectively.

The second line contains n integers , x2 (1≤x**i≤109

Output

Print one integer — the maximum number of pairs of points you can match with each other.

Examples

Input

Copy

4 2
1 3 3 7

Output

Copy

2

Input

Copy

5 5
10 9 5 8 7

Output

Copy

1

Note

In the first example, you may match point 1

with point (|3−1|≥2 with point 4).

In the second example, you may match point 1

with point (|5−10|≥5)

思路:

刚开始就想的是匹配嘛,一看到匹配想到二分图最大匹配,嗯~匈牙利算法,建个图,跑一下试试。不过看样子数据范围有点大,有超时的可能(必然)。不管了,想到这个先写写吧。怎么建图呢?把满足条件的两个点之间连一条边,等等,好像有重复啊,我一个数匹配了就不能再用了啊。我自以为可以解决问题的做法:对一个数来说枚举从他的下一个到末尾。是不是就可以了呢?

不是。我真的是,刚学了二分图就想什么都往上面套,明明怎么建图都还没学过,这样还是不可能建出正确的图。因为一个顶点被用了之后是不知道知道它已经被用了的,这就建不出二分图。

天真的我以为模板写错了,又用了最大流来了好几遍,一直WA,真好。

我就想到二分,然后有一种直觉告诉我,我把数组排个序,然后用lower_bound给每个数来一下查找满足条件的最小元素。但也是直觉产生怀疑,为什么,这样贪心正确吗?有没有可能这里lower_bound了配对以后就影响了后面元素的配对,而且是连环影响,本来可以产生更多配对,结果由于贪心配对数变少了。怀疑是正确的,比如一组例子:

4 2

1 3 4 5

如果找这种方法只能配出1,3一对来,实际上是两对:1,4和3,5

然后我想,那我统计一下元素可能配对的次数,从可能配对次数最小的开始配对,因为它们最不容易配对,优先满足它们可能会让总数大一些,于是又用了结构体排序什么的,也不正确。

眼看着我里正确的思路越来越远,也越来越想不到正确的解。知道是二分复杂度才能下去,知道是贪心才能得出正确解,但我的思路好像很奇怪?

现在来看看正确的思路,我们想最优的情况是什么?是每个元素都配了对,一共n/2对,是不是?那么这个时候配对情况是怎样的呢?是不是前一半小的配后一半大的?如果这点想到了,离正确二分就不远了。就是二分这个排序好的数组,用后一半跟前一半的元素配对,具体的,设中间为mid,最后一个从mid-1开始往前面配对,一旦出现配对元素,答案统计,并更新下一次配对开始的起点为当前位置的前一个位置。(为什么?因为当前如果配好了对,由于数组已经排好了序,下一次是比这次参加配对的后半段的元素更小的一个元素,这个位置及以后的位置上的元素明显不可能满足差值大于z的条件)。

代码:

#include <iostream>
#include <algorithm>
#define max_n 200005
using namespace std;
int n;
int z;
int a[max_n];
int ans = 0;
int main()
{
cin >> n >> z;
for(int i = 0;i<n;i++)
{
cin >> a[i];
}
sort(a,a+n);
int mid=n/2;
int l = mid-1;
for(int i = n-1;i>=mid;i--)
{
while(l>=0)
{
if(abs(a[l]-a[i])>=z)
{
ans++;
l--;
break;
}
l--; }
}
cout << ans << endl;
return 0;
}

后记:

学习模板固然有一定的作用,可是如果在学习过程中产生了依赖,什么都想套用模板而不去思考,后果是什么?什么题都想先百度题解,不认真思考的后果是什么?orz

我虽然菜,而且菜啊

Codeforces C Match Points(二分贪心)的更多相关文章

  1. codeforces 803D Magazine Ad(二分+贪心)

    Magazine Ad 题目链接:http://codeforces.com/contest/803/problem/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个数字k,和一行字符 例: g ...

  2. Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]

    题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗 ...

  3. CodeForces - 343C Read Time (二分+贪心)

    题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...

  4. Educational Codeforces Round 64 C. Match Points 【二分思想】

    一 题面 C. Match Points 二 分析 根据题意很容易想到要去找满足条件的数,因为可以打乱输入的顺序,所以很容易想到二分. 但是如果直接对输入的数组进行二分,如输入$a$,直接在数组里二分 ...

  5. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  6. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  7. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  8. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  9. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

随机推荐

  1. ##C++ format 格式化字符串

    C++ format 格式化字符串实现方式 1. http://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprint ...

  2. Spring Security教程(二)

    上一篇博客中,Spring Security教程(一),我把用户信息和权限信息放到了xml文件中,这是为了演示如何使用最小的配置就可以使用Spring Security,而实际开发中,用户信息和权限信 ...

  3. Servlet 4.0 入门

    Java™ Servlet API 是主流服务器端 Java 的基本构建块,也是 Java EE 技术的一部分,例如,用于 Web 服务的 JAX - RS.JSF (JavaServer Faces ...

  4. 【技术博客】Django中文件下载的实现

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...

  5. 解决myeclipse2017 properties中文被Unicode编码

    输入:http://propedit.sourceforge.jp/eclipse/updates/ 在线安装插件解决.

  6. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  7. [IOT] - Raspberry Pi 4 Model B 系统初始化,Docker CE + .Net Core 开发环境配置

    本教程为在 Docker 中配置 .Net Core,如果想在树莓派 Raspbian 系统中配置 .Net Core,请参考:[IOT] - 在树莓派的 Raspbian 系统中安装 .Net Co ...

  8. netty心跳机制解决

    直接看别个的源码:https://blog.csdn.net/xt8469/article/details/84827443>>https://blog.csdn.net/xt8469/a ...

  9. Mysql 命令 load data infile 权限问题

    [1]Mysql命令load data infile 执行权限问题 工作中,经常会遇到往线上环境mysql数据库批量导入源数据的场景. 针对这个场景问题,mysql有一个很高效的命令:load dat ...

  10. 微信小程序路径表达式解析规则

    小程序 setData 方法支持路径表达式来设置属性,例如 setData({"x.y.z": 1}). 微信官方没有公布路径表达式的语法规则及解析规则,本文所描述的路径表达式解析 ...