【题解】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) ...
随机推荐
- SQL计算出百分比
有clients和lead_sources俩表.mysql数据库. lead_sources表结构类似: clients表中的lead_source_id是外键.现在要统计某时间段内client内每种 ...
- 一个小白的测试环境docker化之路
本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...
- Java多线程之volatile与synchronized比较
可见性: JAVA内存模型: java为了加快程序的运行效率,对一些变量的操作是在寄存器或者CPU缓存上进行的,后面再同步到主存中 看上图,线程在运行的过程中,会从主内存里面去去变量,读到自己的空间内 ...
- Android Studio|IntelliJ IDEA 常用快捷键(Mac|Window)
一 For Mac(Mac OS X 10.5+) F1 显示注释文档F2 高亮错误或警告快速定位Command + F12 显示当前文件的结构(查看所有方法)Command + F 查找文本Comm ...
- (查找函数+atoi)判断与(注册函数+strcmp函数)判断两种方法
loadrunner中接口判断的2中方法 如下: 1. ●查找函数web_reg_find() ● atoi():将字符串转换为整型值 作比较 > 0 Action() { //检查点函 ...
- JavaScript 字符串 & Math & Date
字符串 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中. 'abc' "abc" 单引号字符串的内部,可以使用双引号.双引号字符串的内部,可以使用单引号. 'key=& ...
- Elasticsearch 排序插件的开发
直接观察到的几个问题 简单expression脚本的执行效率 > java 插件,10000条数据可以测试出1ms左右的差距. Es会不断调用newScript来创建"足够多" ...
- day-17 L1和L2正则化的tensorflow示例
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L1范数和L2范数.L2范数也被称为权重衰 ...
- 【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
- protected、public、private
一.protected成员 1. 受保护的成员的可访问性 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它. 派生类的成员及其友元不能 ...