【CF981F】Round Marriage(二分答案,hall定理)
题意:
给出一个长度为\(L\)的环,标号从\(0\)到\(L-1\)。
之后给出\(n\)个新郎,\(n\)个新娘离起点的距离。
现在新郎、新娘要一一配对,但显然每一对新人的产生都会走一定的距离\(d_i\),求所有\(d_i\)中最大值最小是多少。
思路:
- 显然最后的答案具有单调性,故可以二分答案之后来判定。
- 二分最大时间\(x\),那么只添加距离不超过\(x\)的边,做个最大匹配即可。
- 但因为\(n\)达到\(2e5\),显然匈牙利算法不可行。
- 考虑\(hall\)定理:若一个二分图存在完美匹配,那么对于左边任意子集\(S\),其对应边连接了一个点集\(T\),那么有\(|S|\leq |T|\)。
- 但\(hall\)定理考虑的是集合,不好处理。这个题的二分图有一个特殊的地方,就是对于左边的一个点\(i\),连接的一定是一段连续的区间\([l_i,r_i]\)。
- 根据\(hall\)定理,我们要判断不可行的话就需要找到一个点集\(S\),最终\(|S|>|T|\)。考虑极小的一个子集\(|S|\)满足上述条件,也就是此时去掉任何一个点都不满足条件了,此时这个点集一定是连续的一些点,因为二分图的特殊性。
- 所以问题由点集转化为了:在二分图中,若有\(r-l>R_r-L_l\),则不满足条件,移下项就有:\(r-R_r>l-L_l\),然后随便维护一下即可。
感觉\(hall\)定理在某些情况下挺好用的?尤其是二分图比较特殊的情况,用来求最大匹配/判断最大匹配挺优秀的,通常都把问题转换成维护信息的问题。
代码实现将环变成链时有点细节,详见代码:
/*
* Author: heyuhhh
* Created Time: 2019/11/5 19:43:44
*/
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 2e5 + 5;
int n, L;
ll a[N << 2], b[N << 2];
bool chk(int x) {
int p1 = 1, p2 = 1;
int mn = INF;
for(int i = 1; i <= 2 * n; i++) {
while(p1 <= 4 * n && b[p1] < a[i] - x) ++p1;
while(p2 <= 4 * n && b[p2] <= a[i] + x) ++p2;
mn = min(mn, i - p1);
int now = i - p2 + 1;
if(mn < now) return false;
}
return true;
}
void run(){
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) cin >> b[i];
sort(a + 1, a + n + 1); sort(b + 1, b + n + 1);
for(int i = 1; i <= n; i++) a[i] += L, a[i + n] = a[i] + L;
for(int i = 1; i <= 3 * n; i++) b[i + n] = b[i] + L;
int l = 0, r = INF, mid;
while(l < r) {
mid = (l + r) >> 1;
if(chk(mid)) r = mid;
else l = mid + 1;
}
cout << l << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
while(cin >> n >> L) run();
return 0;
}
【CF981F】Round Marriage(二分答案,hall定理)的更多相关文章
- [CF981F]Round Marriage[二分+霍尔定理]
题意 洛谷 分析 参考了Icefox 首先二分,然后考虑霍尔定理判断是否有完美匹配.如果是序列的话,因为这里不会出现 \(j<i,L(i)<L(j)\) 或者 \(j<i,R(i)& ...
- 【CF981F】Round Marriage(二分答案,二分图匹配,Hall定理)
[CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果 ...
- CF981F 二分+Hall定理
对于一个二分的答案 假设存在一个点集使得不满足Hall定理 题中给定的信息说明 左边每个点对应的右边点是一个区间 如果当前点集对应的右边区间是若干个不相交的区间组成的话说明我们还可以找到一个更小的点集 ...
- 二分图hall定理应用+二分+双指针——cf981F(好题)
/* 二分答案,判mid是否合法 如何判断:如果是在直线上,那么遍历匹配即可 现在在环上,即既可以向前匹配也可以向后匹配,那么将环拆开,扩展成三倍 显然a和b的匹配边是不可能交叉的,因为交叉必定没有不 ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- Codeforces Round #377 (Div. 2) D. Exams(二分答案)
D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...
- Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)
链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...
- Cf Round #403 B. The Meeting Place Cannot Be Changed(二分答案)
The Meeting Place Cannot Be Changed 我发现我最近越来越zz了,md 连调程序都不会了,首先要有想法,之后输出如果和期望的不一样就从输入开始一步一步地调啊,tmd现在 ...
- Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论
n people are standing on a coordinate axis in points with positive integer coordinates strictly less ...
随机推荐
- 单词倒序(java)
如何将一串单词组成的字符串倒序呢?如:" we go to school" 变成"school to go we "java代码实现: public stati ...
- Web-[RoarCTF 2019]Easy Calc
看看题目内容,一个计算器,并且过滤了非数字的值,查看源码,上了waf,并且在calc.php显示waf的规则 <?php error_reporting(0); if(!isset($_GET[ ...
- 集成Hive和HBase
1. MapReduce 用MapReduce将数据从本地文件系统导入到HBase的表中, 比如从HBase中读取一些原始数据后使用MapReduce做数据分析. 结合计算型框架进行计算统计查看HBa ...
- mongodb重点知识总结
Mongodb总结 一.NoSQL型数据库介绍 NoSQL,泛指非关系型的数据库.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题.NoSQL(NoSQL ...
- Go语言系列教程
一 Go介绍与开发环境搭建 01-Go语言简介 02-开发环境搭建 03-Go语言集成开发环境之GoLand安装使用 04-Go语言集成开发环境之VS Code安装使用 05-Go包管理详解 二 Go ...
- EJB组件开发实记(1)
安装JBoss或者Wildfly jdk1.4以上. Eclipes安装插件 JBoss Tools: eclipes Jee photon 在eclipes 内部点击 >>Windows ...
- Algorithm: Prime & Euler Function & Productive Function
素数筛 朴素算法 一般来说,可以用试除法判断某一个数是不是素数: bool isPrime(int n) { if(n < 2) return false; for(int i = 2; i & ...
- JMS入门Demo
2.1点对点模式(邮箱) 点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消息,发送的消息,将会先进入队列中,如果有接收端在 ...
- .NET MVC5简介(三)Result
Ajax请求数据响应格式,一个醒目组必须是同意的,前端才知道怎么应付,还有很多其他情况,比如异常了,有ExceptionFilter,按照固定格式返回,比如没有权限,Authorization,按照固 ...
- go-面向对象编程(上)
一个程序就是一个世界,有很多对象(变量) Golang 语言面向对象编程说明 1) Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 ...