第一次用霍尔定理做题..简单的来说,就是判断一张二分图上是否存在完美匹配,只需要证明对于 \(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?的更多相关文章

  1. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  2. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  3. [题解] Atcoder ARC 142 E Pairing Wizards 最小割

    题目 建图很妙,不会. 考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\).所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x ...

  4. 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树

    题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...

  5. [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学

    题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...

  6. 2017国家集训队作业[arc076d/f][Exhausted?]

    2017国家集训队作业[arc076d/f][Exhausted?] 题意: ​ 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...

  7. [atcoder contest 010] F - Tree Game

    [atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...

  8. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  9. 【题解】Atcoder ARC#90 F-Number of Digits

    Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...

随机推荐

  1. Java:break和continue关键字的作用

    二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...

  2. Rails导出CSV

    版本  ruby 1.9  rails 3.2 完整代码 #引入CSV标准类库 require 'csv' class PeopleController < ApplicationControl ...

  3. IAR环境下编译CC2640入门开发

    1. 安装SDK包,之后导入AIR里面,编译报错 看样子似乎是xdc工具的路径配置不对,进入路径配置对话窗 开始配置 配置完之后,重新编译 Fatal Error[Pe1696]: cannot op ...

  4. 绝地求生大逃杀BE启动失败,应用程序无法正常启动

    今日更新绝地求生大逃杀后部分客户反馈绝地求生点击启动提示BE安装,应用程序无法启动 问题原因:经过排查发现,客户开启过超级工作站运行过游戏,在系统镜像包中保留了旧版的BE服务,致使新版BE无法安装,冲 ...

  5. 2019年猪年海报PSD模板-第五部分

    14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1CuZKPmFbbSBvzSXoCt2few                

  6. TPO-14 C1 Locate a political book

    TPO-14 C1 Locate a political book 第 1 段 1.Listen to a conversation between the student and librarian ...

  7. C 计算数字的位数循环

    #include <stdio.h> int main(int argc, char **argv) { // int x; int n=0; scanf("%d",& ...

  8. Period :KMP

    I - Period Problem Description For each prefix of a given string S with N characters (each character ...

  9. Python3 Tkinter-Grid

    1.创建 from tkinter import * root=Tk() lb1=Label(root,text='Hello') lb2=Label(root,text='Grid') lb1.gr ...

  10. Linux系统inotify工具安装配置

    inotify主要功能 Inotify 是一个 Linux特性,它监控文件系统操作,比如读取.写入和创建.Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多.学习如何将 ...