二分图做题笔记

CF1054F Electric Scheme *2700

题意

二维平面上铺了一些电线。每个电线可以看作一条线段,一些是水平的,另一些是竖直
的。在这些电线的交点处会迸发火花(不妨假设水平电线和竖直电线各自内部不交)。

现在电线消失了,你只知道所有 \(n\) 个火花的位置。求原来最少有多少根电线,并构造一组方案。

\(1\leq n\leq 1000\)

题解

每个火花处放一个极小的十字,这样一定有解。

将同行或同列的相邻火花连边,如果能连上那么答案就会减一。

如果有相交的边不能同时连接,因此将边视作点,建出冲突关系图,答案就是 \(2n-最大独立集大小\)

注意到这是一个二分图,跑二分图最大独立集即可,构造方法是跑完最大匹配后在残量网络上 DFS,找出左侧搜到的点和右侧没搜到的点,这些点就是最大独立集。下面来说明这件事。

使用最小割刻画最大独立集,最小割问题是要最小化 \(\sum\limits_{(u_i\to v_i,w_i)} w_i x_{u_i}(1-x_{v_i})\),并强制 \(x_S=1,x_T=0\)。最大独立集问题是要最小化 \(\sum -x_u+\sum\limits_{(u_i - v_i)} +\infin x_{u_i}x_{v_i}\)

我们发现一个 \(x\) 同号一个 \(x\) 异号,下式无法变形到上式。

一般图最大独立集是 NP 问题,但是我们只需要处理二分图,我们将二分图右部点的 \(x\) 取反,即 \(x=1\) 代表它实际在 \(T\)\(x=0\) 代表它实际在 \(S\),然后最大独立集的式子可以变为如下形式,因为 \(x_S=1,x_T=0\),该式可进一步转化。

\[\sum_{u\in \text{left}} -x_u+\sum_{v\in \text{right}} -(1-x_v)+\sum\limits_{(u_i - v_i)} +\infin x_{u_i}(1-x_{v_i})\\ =\sum_{u\in \text{left}} -x_u+\sum_{v\in \text{right}} x_v+\sum\limits_{(u_i - v_i)} +\infin x_{u_i}(1-x_{v_i})-|\text{right}|\\ =\sum_{u\in \text{left}} 1\times x_S(1-x_u)+\sum_{v\in \text{right}} 1\times x_v(1-x_T)+\sum\limits_{(u_i - v_i)} (+\infin) \times x_{u_i}(1-x_{v_i})-|\text{left}|-|\text{right}| \]

根据这个式子连边,然后求出最小割,并在残量网络上搜出一个割的构造,由于我们刚才对右部点进行了取反,因此最终的独立集是左侧搜到的点和右侧没有搜到的点。

实际实现的时候在把中间的边权从 \(+\infin\) 改为 \(1\) 也是可以的,因为中间的边受两侧点的限制最多流 \(1\) 的流量。

提交记录

CF1416F Showing Off *3300

题意

给定一个 \(n\times m\)LRDU 矩阵,除此之外,矩阵上每个格子还有⼀个正整数权值 \(a_{i,j}\)

现在我们根据这些信息求出一个新矩阵 \(b\)\(b_{i,j}\) 的值为:从 \((i,j)\) 出发开始沿着格子上写的方向走 \(10^{100}\) 步之后,经过至少一次的所有单元格的 \(a_{i,j}\) 值之和。

现在给出矩阵 \(b\),请构造任意符合条件的字符矩形,以及 \(a\)。或者报告无解。字符矩形需满足所有边缘的方向不能指向矩形外。

\(1\leq n\times m\leq 10^5\)

题解

我们发现如果一个点 \(u\) 旁边存在一个小于它的点 \(v\),那么令点 \(u\) 方向指向 \(v\) 并令 \(a_u=b_u-b_v\) 即可。

我们发现如果一个点 \(u\) 旁边的所有点的 \(b\) 都大于 \(b_u\),那么这个点往哪走都不行,因此无解。

如果两个点权值相同,那么这两个点可能在同一个环中。

特殊的,如果一个点 \(u\) 旁边不存在一个小于它的点,那么这个点必定在环中,称这样的点为“黑点”,其余点为“白点”。

注意到一个环拆成若干个二元环是不会更差的。

我们把可以在同一个环中的点连边,容易发现这构成一个二分图,我们的问题是求一个匹配方案,要求关键点都被匹配。

我们考虑求最大匹配,但是这样是错的,因为白点可能抢占黑点的匹配。

我们考虑尽可能满足白点,避免其抢占黑点匹配,使用若干个虚拟白点将两侧点的数量补到一致,然后在所有白点之间两两连边,然后跑最大匹配即可。如果存在完美匹配即有解。

让我们尝试说明这是对的:当不存在黑点都被匹配的方案时,我们只加入了白点和白点之间的边,新图也不会存在黑点都被匹配的方案,因此新图不存在最大匹配;当存在黑点都被匹配的方案时,在黑点都被匹配的情况下两侧肯定剩下数量相同的白点,那么将这些白点两两匹配后就是完美匹配,因此完美匹配存在。

白点之间两两连边在网络流中可以使用虚点优化建图。

提交记录

QOJ#3555. Chameleon's Love *????

题意

这是一道交互题。

  • 共有 \(2n\) 只变色龙,其中 \(n\) 只性别为 \(X\),另外 \(n\) 只性别为 \(Y\)
  • 每只变色龙有一个原色,原色取值范围为 \(1\sim n\),满足:
    • 同一性别内部,所有变色龙的原色互不相同。
    • 每只变色龙恰好与一只异性变色龙的原色相同。
  • 每只变色龙有一个恋慕对象,满足:
    • 恋慕对象一定是异性
    • 一只变色龙与其恋慕对象的原色不同
    • 每个变色龙恰好喜欢一只变色龙,且恰好被一只变色龙喜欢。
  • 初始时只知道 \(n\),其余信息全部未知。
  • 允许进行如下操作(最多 \(20000\) 次):
    • 选择一个变色龙集合 \(S\) 举办聚会。
    • 对于每只参加聚会的变色龙:
      • 如果其恋慕对象也参加了聚会,则其肤色变为恋慕对象的原色
      • 否则,肤色保持为自己的原色
    • 最终,你会得到聚会上肤色种类数
  • 目标:通过不超过 \(20000\) 次聚会,确定每只变色龙与哪只变色龙原色相同(即找出所有原色配对的变色龙对)。
  • 数据范围:\(n \le 500\)

部分分:

  • 所有恋慕关系都是双向的。
  • 允许 \(O(n^2)\) 次询问。
  • 性别已知。

题解

考虑部分分一,发现双向恋慕关系在一起时会彼此互换颜色,对肤色数没有任何影响,因此直接二分即可。

因此,我们称两个点 \(a,b\) “有关”,当且仅当满足以下三条中任意一条:

  • \(a\) 喜欢 \(b\)\(b\) 不喜欢 \(a\)
  • \(b\) 喜欢 \(a\)\(a\) 不喜欢 \(b\)
  • \(a,b\) 原色相同。

注意我们完全忽略了双向喜欢的关系。

考虑部分分二,我们让变色龙两两聚会,如果颜色数是 \(1\) 就说明两个变色龙有关。

容易发现对于每个变色龙,与其有关的变色龙有 \(1\)\(3\) 个。

如果与变色龙 \(x\) 有关的变色龙只有一个,设其为 \(y\),那么有 \(x,y\) 原色相同,我们解决了变色龙 \(x\) 的问题。

否则,设 \(a\) 喜欢 \(x\)\(x\)\(b\) 原色相同,\(x\) 喜欢 \(c\)。我们选择 \(x\)\(a,b,c\) 中的两个参加聚会,如果这两个人是 \(a,b\) 那么颜色数为 \(1\),否则为 \(2\),因此我们可以确定哪个是 \(c\),求出所有变色龙的 \(c\) 后就可以推出与所有变色龙的 \(b\)

考虑部分分三。

我们令每个 \(x\) 与一些性别与 \(x\) 不同的变色龙聚会,那么肤色数 \(\neq 聚会人数\),当且仅当里面有变色龙与 \(x\) 有关,因此分三段二分即可。

考虑正解,我们发现部分分三的做法中,不需要满足【与 \(x\) 聚会的变色龙性别都与 \(x\) 不同】,只需要满足【与 \(x\) 聚会的变色龙互相没有关系】即可。

那么增量维护,维护两个独立集 \(S1,S2\),加入一条变色龙时在 \(S1,S2\) 上二分,之后得到与新加入变色龙有关的若干点,之后再重构独立集即可。

由于这是二分图,且 \(n\leq 500\),因此重构独立集是简单的,直接黑白染色即可。

时间复杂度 \(O(n^2\log n)\),询问次数 \(O(n\log n)\)

二分时注意剪枝,不然会被卡询问次数。

提交记录

QOJ#7999. 拉丁方 / P10062 [SNOI2024] 拉丁方

题意

给定一个 \(n \times n\) 的矩阵,其中左上角的 \(R \times C\) 的子矩阵已经填好。要求将矩阵补充完整,使得每行每列均为 \(1 \sim n\) 的排列。需要给出构造或判断无解。

\(1 \leq n \leq 500\)

部分分:\(C = n\)

题解

考虑部分分,我们建出数与列的二分图,发现这是一个二分图边染色问题,\(k\) 正则二分图边染色必定有解,因为根据 Hall 定理一定存在一组匹配,然后删去匹配后变为 \(k-1\) 正则二分图,可归纳证明。

因此对于 \(C\neq n\),我们先填上面的数字,将拉丁方补成 \(C=n\),只要能填出上面 \(R\times n\) 合法的解,那么下面一定有解。

对于上面 \(R\times n\) 的数字,相当于左部点为 \(n\),右部点为 \(R\) 的二分图,要染成 \(n-C\) 种颜色,并且每条边都要被染色,每种颜色 \(R\) 个。我们发现如果存在一个点,其度数大于 \(n-C\),那么说明染色不能办到,否则直接套用二分图边染色即可求解。

填完上面的数字后再用二分图边染色填下面的数字即可。

提交记录

QOJ#8602. Занулити пiдвiдрiзок(UkrainianOI D2T4) *????

题意

给定一个长度为 \(n\) 的数列 \(a_1, a_2, \cdots, a_n\)

初始时变量 \(x=0\),每一步可以进行以下两种操作之一:

  1. \(x \leftarrow x + 1\)
  2. 选择一个 \(1 \leq i \leq n\),令 \(a_i \gets a_i \oplus x\)

\(q\) 次询问,每次给定区间 \([l, r]\),求最少操作次数使得子数组 \(a[l:r]\) 中的所有元素变为 \(0\)

\(1 \leq n, q \leq 2 \times 10^5\)\(1 \leq a_i < 2^{60}\),强制在线。

部分分:\(O(nq)\) 的解法。

题解

首先每个数只会被异或两次,记最后操作到的 \(x\)\(mx\),那么区间 \([l,r]\) 的答案为 \(r-l+1+(mx+\sum\limits_{i=l}^{r}[a_i>mx])=2(r-l+1)-(\sum\limits_{i=l}^{r}[a_i\leq mx]-mx)\),我们要最大化后面减去的部分,令 \(cnt_i\) 表示区间中等于 \(i\) 的数字个数,求出 \(cnt_i-1\)\(i\in [2^h,+\infin)\) 前缀和数组 \(p\),记区间中 \(a\) 的二进制最高位为 \(2^h\),需要满足 \(x\geq 2^h\),那么答案为 \((r-l+1)+cnt+2^{h}-\max\limits_{mx\geq 2^h} p_{mx}\)\(cnt\) 表示最高位是 \(2^h\) 的数的个数。

注意我们要忽略 \(2\) 的整数幂,因为它们总会被异或一次。

我们把 \(cnt_i-1\) 看成扩展 Hall 定理的形式,即 \(cnt_i\to |S|,1\to |N(S)|\),我们构造二分图,左部点为 \(a\),右部点为所有 \(\geq 2^h\) 的整数,左边每个 \(a\) 向右边每个比它小的数连边,那么根据扩展 Hall 定理,最小失配数就是 \(\max \{|S|-|N(S)|\}\),即 \(\max\limits_{mx\geq 2^h} p_{mx}\)。最小失配数可以由最大匹配数得到。

对每个 \(h\) 单独拎出来 \(\text{highbit}=h\)\(a\) 序列,我们要干的事情就是每次给定某个序列的某个区间,求最大匹配。

引理:一定存在一个最大匹配,使得将左侧被匹配的点从大到小排序后,这个被匹配的序列偏序所有其他的最大匹配。

证明:考虑两个不互相偏序的匹配 \(B,C\),将所有匹配边画出,图中将形成若干链和环,然后在这张图上构造新的匹配。对于链,由于是最大匹配,因此匹配方法唯一;对于环,让字典序更优,在新图中一定能找到一个不劣于 \(B,C\) 的匹配。

对序列扫描线,需要维护单点加入,并尝试增广掉最早被加入的节点,求最大匹配。这对于一般二分图是不能低于 \(O(n^2)\) 的。

考虑反向 Hall 定理,维护被匹配的集合 \(S\),并求出只考虑 \(S\)\(cnt_i-1\) 的前缀和,如果有位置大于 \(0\) 就会失配,即 \(S\) 是非法的。

新加入一个数 \(a_x\),线段树维护 \(cnt_i-1\) 的前缀和,将 \([a_x,\max a]\)\(1\),如果出现 \(>0\) 的位置,找出最前 \(>0\) 的位置 \(p\),并找到满足 \(a_y\in [2^h,p]\) 的最小 \(y\),删掉 \(a_y\) 即可。

加入一个数 \(a_x\) 时,相当于在扫描线线段树上的 \(l\leq x\) 的答案加 \(1\),删除同理。由于强制在线,需要可持久化。

【2025/8/27 23:04】 没调完,睡觉了。

”注意我们要忽略 \(2\) 的整数幂,因为它们总会被异或一次。“的另一个原因是,我们需要让 \(cnt-1\) 的前缀最大值从 \(2^h+1\) 开始,先将 \(x\) 加到 \(2^h\)

如果从 \(2^h\) 开始,那么实际上 \(x\) 被加到的初值是 \(2^h-1\),那么此时如果存在完美匹配,无法判断 \(x\) 在这个方案中是否被加到了 \(2^h\) 及以上,如果没有则不符合题意,这会导致你的答案可能比正确答案少 \(1\)

【2025/8/28 15:07】 调完了。

提交记录

posted @ 2025-08-27 23:01  george0929  阅读(33)  评论(0)    收藏  举报