【题解】Atcoder ARC#76 F-Exhausted?
第一次用霍尔定理做题..简单的来说,就是判断一张二分图上是否存在完美匹配,只需要证明对于 \(a\) 集合中的任意 \(k\) 个点来说,都与 \(b\) 集合中的 \(k\) 个点有边相连。如果不满足,那么最大匹配数就是两个集合中有连边的点数最大的差。
这道题目二分图匹配的解法是非常显然的,让 \(i\) 点和对面的 \(1 -> l[i]\), \(r[i] -> m\) 点连边,判断是否存在完美匹配即可。但点数太多了,我们考虑使用霍尔定理来求解。如果我们固定右边选择的点为 \(1->l[i]\), \(r[i] -> m\),那为了判断是否满足我们自然要尽量地使得左边的点数更大(如果在最大情况下依然合法,也就说明的确是存在完美匹配的,当然这也提示我们霍尔定理就是要寻找题目的特殊性质,固定一边的点数来考虑最坏的情况)。要使左边的点数最大,显然我们应该选入所有 \(l -> r\) 在这个范围内的点。所以我们可以使用扫描线降维维护最值。(~ ̄▽ ̄)~
#include <bits/stdc++.h>
using namespace std;
#define maxn 2000000
#define INF 99999999
int n, m, mn[maxn], mark[maxn];
int ans = INF; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct node
{
int l, r;
friend bool operator <(const node& a, const node& b)
{ return a.r > b.r; }
}P[maxn]; void push_down(int p)
{
if(!mark[p]) return;
mark[p << ] += mark[p], mark[p << | ] += mark[p];
mn[p << ] += mark[p], mn[p << | ] += mark[p];
mark[p] = ;
} void Update(int p, int l, int r, int L, int R, int x)
{
if(L <= l && R >= r) { mn[p] += x; mark[p] += x; return; }
if(L > r || R < l) return;
int mid = (l + r) >> ;
push_down(p);
Update(p << , l, mid, L, R, x);
Update(p << | , mid + , r, L, R, x);
mn[p] = min(mn[p << ], mn[p << | ]);
} void Build(int p, int l, int r)
{
if(l == r) { mn[p] = l; return; }
int mid = (l + r) >> ;
Build(p << , l, mid), Build(p << | , mid + , r);
mn[p] = min(mn[p << ], mn[p << | ]);
} int Query(int p, int l, int r, int x)
{
if(l == r) return mn[p];
int mid = (l + r) >> ;
push_down(p);
if(x <= mid) return Query(p << , l, mid, x);
else return Query(p << | , mid + , r, x);
} int main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++) P[i].l = read(), P[i].r = read();
sort(P + , P + + n);
int now = ; Build(, , m);
for(int i = m + ; i >= ; i --)
{
while(now <= n && P[now].r >= i)
Update(, , m, P[now].l, m, -), now ++;
Update(, , m, i, m, -);
ans = min(ans, (m - i + ) + mn[]);
}
if(ans < ) printf("%d\n", -ans);
else printf("0\n");
return ;
}
【题解】Atcoder ARC#76 F-Exhausted?的更多相关文章
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Atcoder ARC 142 E Pairing Wizards 最小割
题目 建图很妙,不会. 考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\).所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
- 2017国家集训队作业[arc076d/f][Exhausted?]
2017国家集训队作业[arc076d/f][Exhausted?] 题意: 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...
- [atcoder contest 010] F - Tree Game
[atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...
- [题解] Atcoder Regular Contest ARC 147 A B C D E 题解
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
随机推荐
- TCP/IP漫游
TCP/IP漫游 TCP/IP是互联网的基础协议栈,它包括大大小小几十个协议.本篇文章主要涉及到就是HTTP.TCP.IP协议.我们经常学的网络模型是七层或者五层,实际上一般认为一共只有四层就可以了. ...
- 3668: [Noi2014]起床困难综合症
3668: [Noi2014]起床困难综合症 https://www.lydsy.com/JudgeOnline/problem.php?id=3668 分析: 每一位分开考虑. 算出每一位为1,计算 ...
- iOS SSL Pinning 保护你的 API
随着互联网的发展,网站全面 https 化已经越来越被重视,做为 App 开发人员,从一开始就让 API 都走 SSL 也是十分必要的.但是光这样就足够了吗? SSL 可以保护线上 API 数据不被篡 ...
- mysql中的直方图采样逻辑
int handler::sample_next(uchar *buf) { // Temporary set inited to RND, since we are calling rnd_next ...
- InnoDB锁冲突案例演示(续)
Preface I've demontstrated several InnoDB locking cases in my previous blog.I'm gonna do the ...
- katalon系列七:Katalon Studio全局变量
假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...
- 代码对齐 (Alignment of Code,ACM/ICPC NEERC 2010,UVa1593)
题目描述: 解题思路: 输入时提出单个字符串,并用一个数组记录每列最长长度,格式化输出 #include <iostream> #include <algorithm> #in ...
- 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10
孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...
- 机器学习介绍(introduction)-读书笔记-
一,什么是机器学习 第一个机器学习的定义来自于 Arthur Samuel.他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域.Samuel 的定义可以回溯到 50 年代,他编写了一个 ...
- python常用命令—查看模块所在位置
环境:ipython3 交互式解释器 语法: import 模块名 模块名.__file__ 功能: 查看模块的所在位置 例: