第一次用霍尔定理做题..简单的来说,就是判断一张二分图上是否存在完美匹配,只需要证明对于 \(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 = 0, k = 1;char c; c = getchar();while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); }while(c >= '0' && c <= '9') x = x * 10 + c - '0', 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 << 1] += mark[p], mark[p << 1 | 1] += mark[p];mn[p << 1] += mark[p], mn[p << 1 | 1] += mark[p];mark[p] = 0;
}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) >> 1;push_down(p);Update(p << 1, l, mid, L, R, x); Update(p << 1 | 1, mid + 1, r, L, R, x);mn[p] = min(mn[p << 1], mn[p << 1 | 1]);
}void Build(int p, int l, int r)
{if(l == r) { mn[p] = l; return; }int mid = (l + r) >> 1;Build(p << 1, l, mid), Build(p << 1 | 1, mid + 1, r);mn[p] = min(mn[p << 1], mn[p << 1 | 1]);
}int Query(int p, int l, int r, int x)
{if(l == r) return mn[p];int mid = (l + r) >> 1;push_down(p);if(x <= mid) return Query(p << 1, l, mid, x);else return Query(p << 1 | 1, mid + 1, r, x);
}int main()
{n = read(), m = read(); for(int i = 1; i <= n; i ++) P[i].l = read(), P[i].r = read();sort(P + 1, P + 1 + n);int now = 1; Build(1, 0, m);for(int i = m + 1; i >= 0; i --){while(now <= n && P[now].r >= i) Update(1, 0, m, P[now].l, m, -1), now ++;Update(1, 0, m, i, m, -1);ans = min(ans, (m - i + 1) + mn[1]);}if(ans < 0) printf("%d\n", -ans);else printf("0\n");return 0;
}

转载于:https://www.cnblogs.com/twilight-sx/p/9693439.html

【题解】Atcoder ARC#76 F-Exhausted?相关推荐

  1. 2021浙江省赛题解(A,C,F,G,J,L,M)

    2021浙江省赛题解(A,C,F,G,J,L,M) A.League of Legends 题解 签到题 直接求和判断一下 注意会爆 i n t int int以及相等的情况. 代码 #include ...

  2. AtCoder题解——Beginner Contest 170——F - Pond Skater

    题目相关 题目链接 AtCoder Beginner Contest 170 F题,https://atcoder.jp/contests/abc170/tasks/abc170_f. Problem ...

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

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

  4. AtCoder Beginner Contest 249题解(E,F)

    E - RLE 题目大意:有一个长度为 N 的只含有小写字母字符串 S ,将S中连续相同的字母用计数法表示,如 aaa -> a3, aaabbbcc -> a3b3c2.现在要求用计数法 ...

  5. atcoder ARC 084 CD题解

    传送门 C: 给定三组数, 问从每一组中选择一个数使得满足a < b < c 的选法有多少种. 首先我们要知道对于第二个数组中的每一个数, 第三个数组中有多少个大于它的记成cb[i], 并 ...

  6. AtCoder题解 —— AtCoder Grand Contest 050 —— B - Three Coins —— 动态规划

    题目相关 题目链接 AtCoder Grand Contest 050 B 题,https://atcoder.jp/contests/agc050/tasks/agc050_b. Problem S ...

  7. AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision

    题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...

  8. AtCoder题解 —— AtCoder Beginner Contest 182 —— D - Wandering

    题目相关 题目链接 AtCoder Beginner Contest 182 D 题,https://atcoder.jp/contests/abc182/tasks/abc182_d. Proble ...

  9. AtCoder题解——AtCoder Grand Contest 048——A - atcoder < S

    题目相关 题目链接 AtCoder Grand Contest 048 A 题,https://atcoder.jp/contests/agc048/tasks/agc048_a. Problem S ...

  10. 第45届ICPC沈阳站部分题解(D、F、G、H、I、J、K)

    文章目录 D-前缀和思想+dfs F-贪心 G H-双指针+dp 题意 思路 代码 I-追及问题+裴蜀定理 J-可持久化线段树 K-前缀和+积分的定义 题意 思路 参考链接 传送门 本文CSDN 本文 ...

最新文章

  1. centeos7安装mariadb
  2. 深入理解c#(第三版)(文摘)
  3. oracle+字段+virtual,Oracle 11g新特性之--虚拟列(Virtual Column)
  4. Fedora 16 正式版专题
  5. 2019牛客暑期多校训练营(第四场)I - String (后缀自动机+回文树)
  6. 413 Request Entity Too Large
  7. 一个用于 Angular 开发的 Chrome 扩展 - Angular Dev Tools
  8. 移动硬盘不可用_如何对您的网站执行移动可用性审核
  9. Hive的UDF概念
  10. jquery easyui 多选下拉框的实现
  11. 你的护城河在哪?老程序员的一些2016感悟
  12. Learning SQL--多表查询
  13. jni4net调用net库
  14. Apollo-原理以及架构图分析
  15. 最全面的SpringMVC教程(二)——SpringMVC核心技术篇
  16. Carte作为Windows服务
  17. 很有意思的几个考验知识广度的问题
  18. qstock 玩转问财:一行代码实现条件选股
  19. 杨立昆最新访谈:AI威胁论是蒙昧主义,控制欲只有人才有 (全文+视频)
  20. cmd-命令行中打开新cmd窗口

热门文章

  1. mysql中设置create_time和update_time默认值并实时更新
  2. Unit1 Homework
  3. 今天研究成功ASP动态管理数据表及字段
  4. [环境搭建]Windows下安装Ruby和Jekyll
  5. ftp服务器默认文件夹,ftp服务器设置文件目录
  6. matlab如何获得一个二值掩码,1.3矩阵的掩码操作 - osc_uarhdl2n的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 流程生产订单和离散生产订单的区别_离散式生产和流程式生产的区别
  8. java 调用 libsvm_请问该如何调用libsvm 的java 库函数?
  9. linux设备符,linux 字符设备(一)
  10. 月结 sap_SAP的SD模块:从DN到Billing再到Invoice