9.4 图论,杂题
Mike and Fish
平面上有 \(n\) 个点 \((x_i, y_i)\),你需要将 \(n\) 个点染成红色或蓝色,使得最终任意一条水平线上或竖直线上的红点和蓝点的数量之差的绝对值不超过 \(1\)。
\(1 \le n \le 2 \times 10^5, 1 \le x_i, y_i \le 2 \times 10^5\)
欧拉回路的典型例题。首先水平与竖直线的限制可以考虑把点变成边。建立二分图,左部点表示行数,右部点表示列数,点就变成 \((x_i)_L \leftrightarrow (y_i)_R\) 的一条边。考虑绝对值不超过 \(1\) 是什么意思:你需要尽量平衡左右部点上连的边中红蓝两种边的数量。如何刻画?欧拉回路就来了。欧拉回路的出入边数量相等。
那我们现在绝对值 \(\le 1\),只需要一个欧拉路径,把奇度点两两连一条虚边,跑一个欧拉回路即可,按照欧拉回路定向后染色就完了。
Two Trees
给定两棵有根树,现在需要为每个点指定一个权值 \(a_i\),使得对于每个点 \(u\),它在两棵树中的子树权值和的绝对值均为 \(1\)。请构造一组方案,或判定无解。
\(1 \le n \le 10^5\),两棵树的根不一定相同。
原来感觉非常神仙,现在看其实相当常规,而且非常优雅。甚至不需要建虚点。
这本质上仍是一个平衡问题,但直接构造图并不容易。我们先进行一些观察:总可以通过调整使得 \(|a_i| \le 1\)。这是因为,设子树和为 \(b_i\),所有儿子的 \(b_v\) 可以通过在 \(\pm 1\) 之间平衡,使得最终 \(|\sum b_v| \le 1\)(对于 \(b_v = +1\) 的儿子,翻转整棵子树即可得到相反数)。进一步可知,若儿子数为奇数,则 \(a_i = 0\);若为偶数,则 \(a_i = \pm 1\)。如果在两棵树中,某个点儿子数的奇偶性不同,则输出 IMPOSSIBLE。
构造 \(a_i = \pm 1\) 时,考虑将点拆成边,在两棵树中各添加一条横叉边,通过定向这条边来确定 \(a_i\)。考虑子树和的限制,我们发现把树边加上就天然是子树和贡献。考虑一个普通点(Normal Case):它拥有一条横叉边、所有儿子的边,以及一条连向父亲的边。
若将连向父亲的边定义为“向上为 \(+1\)、向下为 \(-1\)”,那么这条边的最终方向恰好等于该点的子树和。但还有一个 Corner Case:根节点没有父亲,却有值,因此我们可以在左右子树的根节点之间再连一条横叉边(允许重边)。注意,两棵子树最终定向恰好相反,即如果左子树中向上表示子树和为 \(+1\),则右子树中向上子树和为 \(-1\)。但是最后我们只关心横叉边。
这题最神仙的一步就是将子树和的关系转变成定向问题,对于树边的定向无疑是完美利用了欧拉回路出入度相等的性质。
铁人两项
给定一张无向图,求选取三个互异点 \(s, c, f\) 的方案数,使得存在一条简单路径 \(s \to c \to f\)。
\(1 \le n \le 10^5, 1 \le m \le 2 \cdot 10^5\),无重边无自环。
点双连通分量有结论:任给 \(3\) 个不同的点 \(x, y, z\),必然有简单路径 \(x \to y\),所以我们只需要求出在圆方树上两点之间的圆点个数即可。将方点赋值为 \(\mathrm{size}\),圆点赋值为 \(-1\),然后就可以统计了。
[PA 2010] Riddle
\(n\) 个点 \(m\) 条边的无向图被分成 \(k\) 个部分。每个部分包含一些点。
请选择一些关键点,使得每个部分恰有一个关键点,且每条边至少有一个端点是关键点。
\(1 \le k \le n \le 10^6, 0 \le m \le 10^6\)
对于每个部分只能选一个关键点,我们不妨弱化一下限制,最多选一个关键点,然后可以用 2-SAT 刻画这个问题,对于每个点(1),连向它所在的部分的其他点(0)。这样连的边太多了,考虑优化,可以在每个部分中做前后缀优化建图。注意它最好要的是恰好,所以尽量把能选的选了,就可以做到恰好了。
原题严重卡空间,不要用 vector。对于第一条限制,无需显式建图。
[JSOI2019] 精准预测
\(n\) 个人,有 \(m\) 条预测,分为两种:
- 形如
0 t x y:如果 \(x\) 在 \(t\) 时刻前死亡,则在 \(t+1\) 时刻,\(y\) 死亡。- 形如
1 t x y:如果 \(x\) 在 \(t\) 时刻时存活,则在 \(t\) 时刻,\(y\) 死亡。人死不能复生,所以你要对每个人 \(i\) 求出在 \(T+1\) 时刻,\(i\) 存活的情况下,可能存活的人数。
\(T \le 10^6, 1 \le n \le 5 \times 10^4, 1 \le m \le 10^5\)。
一个显然的思路是对于每个时刻的人存活状态建点 \((t, i, 0/1)\),但这样点数可以达到 \(\mathcal O(nT)\) 级别。但是由于 \(m\) 条预测数量不多,所以只有出现过的 \(x, t\) 对是有效的,考虑只建这些点,点数为 \(\mathcal O(n+m)\),然后在 \(\forall t_1 \le t_2, (t_1, i, 0) \to (t_2, i, 0) \land (t_2, i, 1) \to (t_1, i, 1)\)。再把预测的限制加上即可,总边数为 \(\mathcal O(n+m)\)。
跑 tarjan 后缩点得到 DAG,然后就变成一个经典的可达性统计的问题。注意到直接开完 bitset 空间会炸,所以分几次跑就完了。然后这个题 emm.... 人可以自杀,就是第 2 中操作的传递可以使一个人在 \(t\) 时刻存活推出不存活,那么只能让他自杀了😭。
「Cfz Round 7」anybody can finds love (expect you)
给定可能有重边的无向连通图,你需要在其中求一个欧拉回路,使得不存在 \(x \to y \to x\) 的形状。
\(1 \le n, m \le 10^6\)。
看起来很简单的题,仔细考虑一下感觉好像妙妙的。首先尝试刻画无解情况。存在奇度点,则无欧拉回路,无解;考虑 \(x \to y \to x\) 的情况,容易发现这其实是一个对边两两配对的过程,那么只要存在一个点,它连向某个点的边数超过它连出去的边的一半(绝对众数),那么就无解;否则,由于欧拉路径的结论,我们每次走过一条边时,就尝试走它的匹配边即可,这样一定能走出回路。
我们把匹配的边拿出来,一条边只会连两个点所以只有两个匹配边,把边和匹配边拿出来建图,容易发现变成了若干个环。考虑 Hierholzer 算法流程就是每次并一个环上去。现在对于某个点 \(u\),考虑它所处的两个环(可能不止两个),设它在两个环中连的四个点分别为 \(a, b, c, d\),其中 \((a, u), (u, b)\) 匹配,\((c, u), (u, d)\) 匹配,所以有 \(a \neq b, c \neq d\),那么就有 \(a \neq d \land b \neq c\) 或 \(a \neq c \land b \neq d\) 至少一个成立。如果不行就反着走环就行了。
[QOJ10706] Red-Blue MST
给定一张无向连通图,每条边被涂成红色或蓝色,边权为 \(w_i\),对于 \(0 \le k \le n-1\),求出恰好包含 \(k\) 条红边的最小生成树权值,或报告无解。
\(2 \le n \le 10^5, n-1 \le m \le 2 \times 10^5\)。
恰好 \(k\) 条,首先要有能力辨别出这个东西是有凸性的。所以单点查询的时候考虑 wqs 二分,但是由于有多次询问,所以这里是不管用的。考虑一个看起来对对的结论:每次是加入一条红边替换一条蓝边,选择一个合法的权值差最小的即可。
[QOJ7837] 挑战积和式
给定自然数序列 \(a\),构造长度为 \(k\) 的序列 \(b_i \in [1, n]\),使得 \(\sum _{i=1}^ka_{b_i} - \prod_{i=1}^k b_i\) 最大。
\(n, k \le 10^6, 0 \le a_i \le 10^9\)
todo.
[QOJ7872] 崩坏天际线
给定 \(n\) 和 \(Q\),有 \(Q\) 次操作:
1 l r,表示添加一个新的区间 \([l, r]\)。2 x,表示所有满足 \(l \le x \le r\) 的区间 \([l, r]\) 崩坏,等概率选择变为 \([l, x]\) 和 \([x, r]\)。求最后所有区间长度和的期望值。
\(1 \le n \le Q \le 5 \times 10^4\)。
todo.

浙公网安备 33010602011771号