2025.5 题目随记

Hall 定理

设一个二分图的两部为 \(X\)\(Y\),且 \(|X|\leq|Y|\),那么其存在完美匹配的充分必要条件是——对于每个 \(X\) 的子集 \(S\),都有 \(|N(S)|\geq |S|\),其中 \(N(S)\)\(S\) 的邻集。

Proof.

首先证明必要性,考虑反证法。若二分图存在完美匹配,且 \(|N(S)| < |S|\),那么 \(|S|\) 中的点必然不可能匹配完全,因为跟它匹配的点都不够,必要性是显然的。

接下来证明充分性,我们使用数学归纳法。

  1. 我们断言,在如上条件满足的情况下,且存在一个子集满足 \(|N(S)|=|S|\),则这个二分图存在完美匹配。
Proof.

如果删去集合 \(|S|\)\(|N(S)|\),存在 \(|N(T)| < |T|\) 的集合 \(T\),那么在没删集合 \(S\) 的时候,\(|N(S\cup T)|\leq |N(S)| + |N(T)|<|S|+|T|=|S\cup T|\),与我们的假设矛盾,于是此情况下,Hall 定理直接成立。

  1. 递归部分,若对于左部点,任意集合 \(S\) 都满足 \(|N(S)|>|S|\),那么我们考虑找到 \(S\) 中的一个点 \(u\),找到一条匹配边 \((u,v)\),我们把 \(u\)\(v\) 都删去,这样我们也不用考虑 \(u\) 了,因为 \(u\) 已经匹配了。

然后由于我们删去了点 \(v\),所以对于任意集合 \(S\)\(|N(S)|\) 要么不变要么减去了 \(1\)。由于 \(|N(S)|>|S|\),所以 \(|N(S)|-1\geq |S|\)

于是我们就成功归纳到小问题了。

综上,Hall 定理成立,证毕。

Hall 定理强推论

这个在 arc076f 里面有用到,不过那个题我写过,现在就不写了,回头再说那个题吧。

定理说的是二分图的最大匹配数 \(q = |X| - \max(|S| - |N(S)|)\),其中 \(S\)\(X\) 的子集。

Proof.

  1. \(q \leq |X| - \max(|S| - |N(S)|)\)

这个是较为显然的,你显然有 \(\max(|S| - |N(S)|)\) 个匹配不上,其他的我也不知道匹不匹配的上,故此部分成立。

  1. \(q \geq |X| - \max(|S| - |N(S)|)\)

我们考虑构造法,我们在右部中加入 \(\max(|S| - |N(S)|)\) 个点,让他们与 \(X\) 中的每个点都有连边,这时,显然的,每个子集 \(S\) 都有 \(|N(S)|\geq |S|\),那么根据 Hall 定理,其有完美匹配。

那么删掉这 \(\max(|S| - |N(S)|)\) 个点后,也至多会有 \(\max(|S| - |N(S)|)\) 不匹配,故此部分成立,综上,推论正确。

[ARC106E] Medals

首先可以很快想到一个网络流建模,我们左部点是人,右部点是天,我们源点 \(s\) 向每个左部点连一条流量为 \(k\) 的边,然后左部右部之间连边按题意来即可。最后天和汇点连流量为 \(1\) 的边,然后二分右部点个数,跑最大流看是否能跑满即可,复杂度显然不对。

虽然 Hall 定理据 ysz 说在这种图上也成立,但是我还是倾向于把一个点拆成 \(k\) 个点,然后连容量为 \(1\) 的边看是否能流满。这样就是一张标准的二分图了,我们考虑使用 Hall 定理。

\(g_i\) 为第 \(i\) 天的有效人的集合,这可以 \(O(2^n\times k)\) 预处理出来。

然后借鉴上面的思路,二分一个 \(mid\)。接下来的思路也非常有启发性,我们想求出每个集合 \(S\)\(|N(S)|\),而其能包含天数 \(p\) 的充分必要条件是其与 \(g_p\) 有交。这个东西非常不好刻画。于是我们反过来算。取 \(S\) 的补集 \(S'\),问题转化为 \(S'\) 能包含多少个天数的集合,这样 \(S\) 与这些天的集合就不可能交,反之一定能交。于是我们设 \(f_i\)\(i\) 集合能包含多少个天数的集合,这可以非常容易的使用 SOS DP(高维前缀和)求出,然后我们取的就是 \(mid - f_{S'}\)

对于每一个集合 \(S\) 判断 \(popcount(S)\times k\) 是否大于 \(mid - f_{S'}\) 即可。

于是我们就做完了。

[ARC106F] Figures

OGF 好题 + 入门题。

首先注意到,如若给定了度数序列 \((r_1,r_2,...,r_n)\),且 \(\sum_{i=1}^n r_i = 2\times n-2\),那么我们可以对 Prufer 序列稍加变形,答案即为 \(\frac{(n-2)!}{\prod_{i=1}^n (r_i-1)}\times \prod_{i=1}^n A_{d_i}^{r_i}\)。注意到我们可以将 \((n-2)!\) 拿出来。而 \(\prod\) 也较难处理,但是注意到这些东西都是分开的,于是我们也分开算。

因为 \(r_i\) 是一个枚举的过程,所以我们可以将其写为 OGF 的形式。

\(f_{i}(x)\)\(i\) 点的生成函数,满足 \(f_{i}(x) = \sum_{k\geq 0} \frac{A_{d_i}^{k}}{(k-1)!}\times x^k\)

推式子。$$\sum_{k\geq 0} \frac{A_{d_i}^{k}}{(k-1)!}\times x^k$$

\[=\sum_{k\geq 0} \binom{d_i}{k}\times k \times x^k \]

\[=d_i\sum_{k\geq 1} \binom{d_i-1}{k-1}\times x^k \]

\[=d_ix\sum_{k\geq 0} \binom{d_i-1}{k}\times x^k \]

以上都是非常基本的推式子组合变换。接下来使用广义二项式定理把去掉生成函数的求和形式,变为:

\[=d_ix(1+x)^{d_i-1} \]

现在,我们将原式表达出来:

\[(n-2)!\times [x^{2n-2}]\prod f_{i}(x) \]

\[= (n-2)!\times [x^{2n-2}]\prod d_ix(1+x)^{d_i-1} \]

\[= (n-2)!\times \prod d_i\times [x^{n-2}]\prod (1+x)^{d_i-1} \]

\(S = \sum d_i\),那么原式变换为:

\[= (n-2)!\times \prod d_i\times [x^{n-2}](1+x)^{S-n} \]

\[= (n-2)!\times \prod d_i\times \binom{S-n}{n-2} \]

\[= \prod d_i\times \prod_{i=0}^{n-3}(S-n-i) \]

这样即可 \(O(n)\) 求出答案。

[ARC107C] Shuffle Permutation

感觉还不错的题,就记一下。看起来题目非常的不可做,于是我们考虑寻找不变量。注意到交换列的时候行号是永远不变的,行亦然。

于是我们考虑把行和列分开看。注意到在交换列的时候,列与列交换的可行的连边,构成一个个连通块。而列可以在自己所处连通块内任意交换。于是一个连通块内,列的排列方式就是 \(siz_i!\),根据乘法原理,我们把这些东西乘起来即可。

行一样处理,最后都乘起来即可。暴力枚举即可,可以使用并查集维护连通块大小。

CF1290F Making Shapes

数位 DP 好题。

由于题目限制了凸包,于是你选定向量后,凸包形态是固定的。设 \(i\) 向量选了 \(a_i\) 次,于是我们有 \(\sum_{x_i>0} a_ix_i=\sum_{x_i<0} a_i(-x_i),\sum_{y_i>0} a_iy_i=\sum_{y_i<0} a_i(-y_i)\)

与普通数位 DP 不同的是,我们考虑从低往高位 DP。这样你可能与 \(m\) 大小的讨论会有点儿麻烦,但是是不存在后效性一说的,因为数位本身没有后效性。

对于每一层,我们 \(2^n\) 暴力枚举这一层选的向量集合,因为我们确实并不关心向量到底选了多少个,而是关心他们之间和的相对关系,所以这个是对的。考虑你从低到高 DP 显然要维护一个进位,但是因为值域非常小,所以进位也不会太多,正常转移正常判即可。

然后我们就做完了。

CF1856E2 PermuTree (hard version)

比较经典的 Trick。

首先做 E1,我们可以猜一个比较好猜的结论,就是子树内编号连续,证明应该也不太难吧,不管了。反正就是你要让大于 \(a_{lca}\) 的个数乘以小于 \(a_{lca}\) 的个数尽量的大,又由于和是一定的,那么由均值不等式,只要让两个差尽可能小即可,但是实际上我们并不会用到这个东西。

考虑以每个点为 \(lca\) 暴力跑背包。这样是 \(O(n^2)\) 的,可以过掉 E1。

那么由于 \(\sum_{i=1}^{\sqrt{n}}\) 约为 \(n\)。于是背包本质不同物品个数仅是 \(\sqrt{n}\) 级别的。这是个非常重要的发现,于是我们可以对这 \(O(\sqrt{n})\) 个物品跑多重背包。考虑直接二进制拆分。

又由于我们在做可行性背包,于是我们可以使用 bitset。于是复杂度来到 \(O(\frac{n\sqrt{n}\log n}{w})\)。但是由于题解的分析,我们的复杂度其实是 \(O(\frac{n\sqrt{n}}{w})\),我们就可以过了。

虽然我也不知道最后一步怎么分析出来的不过这不重要了。

QOJ 9224 Express Eviction

对偶图最小割。

我们是在边界线上走的,然后你要从左上到右下。而原图连通等价于其对偶图不连通。而禁用的格子就可以直接连边了。连边怎么连呢,就是你在原图上考虑他禁用的是与本正方形有交的边,那么一个禁用格子如果可以通过禁用边走到另一个禁用格子,那么这两个东西就应该连边。

而这个东西你稍微分类讨论一下就是切比雪夫距离 \(\leq 2\) 的格子连边。

让其不连通,只需要在这张图上跑最小割即可。一个流量代表着把一个禁用点撤掉就是了。

[ARC107D] Number of Multisets

好题。

考虑你先把这个集合写出来。你考虑 \(\frac{1}{2^i}\) 这个东西是由一个 \(1\) 乘以 \(i\)\(\frac{1}{2}\) 构成的。

而我们要做的,就是在这个集合里填 \(1\),或者将此时集合内的所有数乘以 \(\frac{1}{2}\)。这样我们集合内的数应当是从小到大递增的。

转移时,我们设 \(f_{i,j}\) 为集合内有 \(i\) 个数,和为 \(j\) 的方案数。那么我们加一个 \(1\) 就是加上 \(f_{i-1,j-1}\),乘以 \(\frac{1}{2}\) 就是加上 \(f_{i,j\times 2}\)。而且因为你可以多次乘以 \(\frac{1}{2}\),所以你这是一个完全背包。

好像现在才明白完全背包的转移方式唉。

CF475E Strongly Connected City 2

好题。首先有一个很强的结论。就是一个边双联通分量可以被定向成为一个 SCC。方法是 DFS 出双连通分量的一棵 DFS 树,树边全部向下,而返祖边全部反向即可。

这启发我们对于原图进行边双联通分量缩点。在一个 EBCC 中的贡献实质上是 \(siz_i^2\)。然后我们可以考虑缩完的树上的贡献。

我们证明一个更强的结论:必定存在一个根,使得对于其每一个子树,要么子树内边全部是向下指的,要么全部指向它。证明可以考虑将几条边反向然后调整归纳感受证明。

所以我们可以暴力枚举根,计算其子树大小,然后就变为了 CF1856E2 PermuTree (hard version)。跑背包即可。

复杂度 \(O(n^2)\),当然可以用那题的结论将背包部分优化到 \(O(\frac{n\sqrt{n}}{w})\),但是要保证总体复杂度,需要发现一个更加强大的结论,即这个根必然是带权重心,当然我也不会证那就随意了。\(n^2\) 也能过。

P9829 [ICPC 2020 Shanghai R] Traveling Merchant

基本的圆方树题吧,不讲我应当也会的。

看一眼结论,显然是个环,什么样的环也比较显然,首先得是个简单环,复杂环不优啊。然后就是肯定环上大多都是异色边,然后你手摸一下发现 \(3\) 元环是正确的。然后拓展一下发现是有一组同色边,其他是异色边就对了。

然后就是枚举同色边,看是否存在一条从 \(1\)\(v\) 经过 \(u\) 的颜色交替路径。这玩意儿应当是挺简单的。取 \(u\)\(v\) 的父亲 \(fu\)\(fv\) 这两个方点,判断他们是否有祖先后代关系即可。判断祖先后代关系可以不带 \(\log\),判断 dfn 转化为区间相互包含即可。

CF1062F Upgrading Cities

较为牛的一道题。考虑写出其拓扑序。

拓扑序有很多种,但是其中不变的量是有启发性的,我们记 \(u\) 的其中一种拓扑序列所处位置为 \(f_i\)。那么对于 \(f_v<f_u\),则 \(u\) 必然不能到达 \(v\),然后对于 \(f_v>f_u\)\(v\) 必然不能到达 \(u\)

那么对于原题面,对于 \(u\),若其为关键点,则对于任意的 \(f_v<f_u\),在拓扑排序执行到 \(u\) 时,若 \(u\) 出队,队列此时必然为空。因为若有点,说明一定存在一个 \(p\) 使得 \(outd_p=0\),那么就完蛋了。反过来是一样的,跑一遍反图即可。

接下来,对于半关键点,在上面的队列为空修改为队列大小为 \(1\) 即可。但是还应该有一些限制,即队中唯一的元素的邻域中,不能存在一个 \(q\) 使得 \(ind_q=1\),因为若 \(ind_q>1\),其可以通过别的拓扑序更大的点达到。但是等于 \(1\) 就只能由队中唯一元素到达,你把它删了,那 \(u\) 也到达不了 \(q\) 了,\(q\) 也到达不了 \(u\) 了,那也完蛋了,反之亦然。

两种关键点可以合在一起写,正图反图跑两边拓扑排序即可。最后把可达点一和,大于等于 \(n-2\) 即可统计到最终答案中。

然后我们就做完了。

[AGC071C] Orientable as Desired

我们先考虑 \(\forall i,x_i=0\) 这样赋值,得到其的一个必要条件。这样,每个点如果要想成立,那么就必须是一张二分图。很好证,稍微证一下就是每个点要么全出要么全入,那么相邻两点的状态不可能相同,那么把全出设为白点,全入设为黑点,那么就是判断能否对原图黑白染色即可,即判断是否是二分图。

那么如果不是二分图,那么直接是 Yes。如果是二分图,我们考虑加强这个赋值。我们随意给一个地方调成 \(x\),其他保持 \(0\),我们 No 的条件是对于所有的 \(u\),满足让 \(x_u\in [0, deg_u]\),其余为 \(0\) 都可行。还挺苛刻的。而且这样赋值的充分性显然但是必要性我并不会证,我觉得应该也很难证明,先咕着。

然后就是考虑调整。我们考虑我们在干什么。我们建圆方树然后我们删了一个割点,他把圆方树分成了若干个连通块。对于每一个连通块,我们能做的只有整体换向。

那么换之前是与选定 \(u\) 相连的边数,换之后就变成了 \(0\)。于是我们就转换成了类背包问题,物品是 \(siz_i\),看能否用这些 \(siz_i\) 凑出 \([0, deg_u]\) 中的所有值。

我们有强结论:将 \(siz_i\) 从小到大排序,若对于 \(\forall i\) 满足 \(\sum_{j=1}^{i-1}siz_j\geq siz_i-1\),那么就成立。

我们考虑使用数学归纳法进行证明:

首先对于 \(i=1\)\(i=2\) 可以验证成立。

接下来递归考虑这个问题:

\(j=i-1\) 成立,那么说明我们可以用前 \(i-1\) 个物品凑出 \([0,\sum_{j=1}^{i-1}siz_j]\),那么我们加入第 \(i\) 个物品变到 \(j=i\),则显然不会有空缺,且一定可以强制选 \(siz_i\) 凑出 \([(\sum_{j=1}^{i-1}siz_j)+1,(\sum_{j=1}^{i}siz_j)]\)。并起来就是当前全集。

那么我们就证明完了,然后这道题也做完了。

posted @ 2025-05-27 15:03  DataEraserQ  阅读(29)  评论(0)    收藏  举报