续接昨天的讨论,昨天的引理 1 和引理 4 后面看了一下发现是同一个定理,无伤大雅
一:
首先讨论提到的 GESP202509L8T2 :对于一个带权稀疏连通图 \(G = (V, E)\) ,询问每条边从 \(G\) 中删除后得到的图 \(G^{'}\) 中的最小生成树边权和,或者回答不存在生成树。
考虑在 \(G\) 中随意构造一棵最小生成树 \(T\) 。
如果一条边是非树边,其被删除后得到的 \(G^{'}\) 中最小生成树依然可以是 \(T\) 。
如果一条边是树边 \(\alpha = \{a, b\}\) ,其被删除后导致 \(T\) 成为两个联通分量 \(T^{'}_1, T^{'}_2\) ,如果存在一条边 \(\beta = \{x, y\}\) 满足 \(x, y\) 分别在两个联通分量中,则只需加入权值最小的那条边即能得到新的最小生成树 \(T^{*}\) ,并且有 \(c(T^{*}) = c(T) - c(\alpha) + c(\beta)\) 。
进一步地考虑 \(x - y\) 加上 \(\beta = \{x, y\}\) 必然是一个环,由定理“一条边是桥当且仅当它不在任何环内”,若存在非树边 \(\beta = \{x, y\}\) 联通 \(T^{'}_1, T^{'}_2\) ,则会满足 \(\alpha\) 在树中的路径 \(x - y\) 上。
考虑预处理每条非树边 \(\beta = \{x, y\}\) ,剖出树链 \(x - y\) 并对其做区间修改取最小值。则查询一条树边 \(\alpha = \{a, b\}\) ,只需查询其上覆盖的最小非树边权值 \(w(\alpha)\) ,则 \(c(T^{*}) = c(T) - c(\alpha) + c(w(\alpha))\) 。
树链剖分的时间复杂度为 \(O(|E| \log^{2} |V|)\) 。
二:
然后昨天同学问了我一个问题,是这样。给定 \(N\) ,求两个整数 \(A, B\),满足 \(0 \leq A, B \leq N\) 且 \(A \oplus B = N\),最大化 \(A + B\) 的值。
第一个想法,如果没有限制 \(max(A, B) \leq N\) 。
若 \(N\) 的第 \(i\) 位是 \(1\) ,随便分给 \(A\) 或 \(B\) ,对 \(A + B\) 贡献 \(2^{i}\) 。
若 \(N\) 的第 \(i\) 位是 \(0\) ,\(A\) 和 \(B\) 可以都是 \(0\) 或 \(1\) ,那么让其都为 \(1\) ,对 \(A + B\) 贡献 \(2^{i + 1}\) 。
考虑进 \(max(A, B) \leq N\) 的限制,只需记 \(N\) 的最高位 \(m1\) 和次高位 \(m2\) 。否则分类讨论。
若 \(N\) 的第 \(i\) 位是 \(0\) ,当且仅当 \(m2\) 的更高位 \(A\) 和 \(B\) 应该赋 \(0\) ,否则都能赋 \(1\) 。
若 \(N\) 的第 \(i\) 位是 \(1\) ,最优方案不受影响,只需把 \(m1\) 分配给 \(A\) ,\(m2\) 分配给 \(B\) ,更低位随意,则最终满足 \(0 < B < A < N\) 。
\(0\) 位和 \(1\) 位的贡献都满足条件且最优,此时有 \(A + B\) 最大。
注意这里确实有一个结论 \(A + B = A \oplus B + 2 (A \ AND \ B)\) ,但大多时候比较鸡肋,至少这里用不上。
三:
考虑扩展带权连通图上的贪心构造最小生成树,得到一个新的 Prim 算法。
定理:
设 \(G = (V, E)\) 带权连通图,权函数为 \(c\) ,\(u\) 是 \(G\) 的任意一个顶点。
- 令点集 \(U = \{u\}\) ,边集 \(F = \emptyset\) 。
- 确定一条边权最小的 \(\alpha = \{x, y\}\) 满足 \(x \in U\) 而 \(y \in \overline{U}\) ,将 \(y\) 加入 \(U\) ,\(\alpha\) 加入 \(F\) 。
令 \(T = (U, F)\) ,则 \(T\) 是 \(G\) 上的一棵最小权生成树。
证明:
从 \((U = \{ u \}, F = \emptyset)\) 开始,每次必然能从连通图 \(G = (V, E)\) 中找到一条边 \(\alpha = \{x, y\}\) 满足 \(x \in U, y \in \overline{U}\) 并加入 \(U\) ,算法的第 \(i\) 次执行都会得到一个 \(i + 1\) 个点 \(i\) 条边的树。显然最终 \(T = (U, F)\) 是 \(G\) 的一棵生成树。
接下来的证明主体思路和 \(Kruskal\) 一样。
设 \(F\) 中的边是 \(\alpha_1, \alpha_2, \cdots, \alpha_{|V| - 1}\) 并且他们会按照这样的顺序放入,令 \(T^{*} = (V, F^{*})\) 是一棵与 \(T\) 有着最多公共边的最小生成树,如果能证明 \(F^{*} = F\) ,则 \(T\) 是一棵最小生成树。
假设 \(F^{*} \neq F\) ,并设 \(\alpha_k\) 是 \(F\) 中放入的第一条不是 \(F^{*}\) 中的边,设 \(T\) 在生成过程中边集为 \(\alpha_1, \alpha_2, \cdots, \alpha_i\) 的树为 \(T_{i} = (U_i, F_i)\) 。
因为 \(T^{*}\) 是生成树,那么存在一条不是 \(\alpha_{k}\) 的边 \(\beta\) 满足一个顶点在 \(U_{k - 1}\) 中另一个顶点在 \(\overline{U_{k - 1}}\) 中。考虑 \(T^{*}\) 删去 \(\beta\) ,根据定理“\(n \geq 1\) 阶的连通图是树当且仅当它的边数是 \(n - 1\)”,则得到两棵树 \(T^{*}_1, T^{*}_2\) 且点集分别为 \(U_{k - 1}, \overline{U_{k - 1}}\) 。
显然 \(\alpha_{k}\) 一个顶点在 \(U_{k - 1}\) 中一个顶点在 \(\overline{U_{k - 1}}\) 中, \(T^{*}\) 去除 \(\beta\) 后再加入边 \(\alpha_{k}\) ,则能得到一棵树 \(T^{**}\) 且点集为 \(V\) ,那么 \(T^{**}\) 是一棵 \(G\) 的生成树。
于是有 \(c(T^{**}) = c(T^{*}) - c(\beta) + c(\alpha_{k})\) ,由 \(T^{*}\) 是一棵最小生成树则有 \(c(\beta) \leq c(\alpha_{k})\) 。
又因为 \(T_{k - 1} = (U_{k - 1}, F_{k - 1})\) 选入 \(\alpha_{k}\) 意味着在所有满足性质“一个顶点在 \(U_{k - 1}\) 另一个顶点在 \(\overline{U_{k - 1}}\) ”的边中 \(\alpha_{k}\) 具有最小权,而 \(\beta\) 也满足这个性质,则 \(c(\alpha_{k} \leq c(\beta))\) 。
于是 \(c(\alpha_{k}) = c(\beta)\) ,于是 \(T^{**}\) 是一棵最小生成树,且比 \(T^{*}\) 有着比 \(T\) 更多的公共边,这和 \(T^{*}\) 的定义是矛盾的,这说明 \(F^{*} \neq F\) 是不正确的。
\(\square\)
四:
一些同学昨天和今天问的问题。
4.1 对于 \(n \times m\) 的矩形,有多少个子矩形?
大体思路肯定是考虑四条边界线。
组合贡献角度的思路:是枚举两条横线的方案数乘以两条竖线的方案数。结果是 \(\binom{m}{2} \times \binom{n}{2}\) 。
枚举角度的思路是:枚举横轴上两条竖线间的区间大小 \(i = 1, 2, \cdots, m\) ,则有 \(m + 1 - i\) 个,这可以贡献横轴上的两条竖线的方案数。竖轴上同理。最后利用乘法原理。
4.2 询问字符串 \(str\) 上各个 \((a, b)\) 子序列的个数?
倒序枚举 str 的索引 i 可以维护出 \([i, N]\) 中 \(j\) 字符的个数 \(v_j\) ,考虑对 \(cnt(str_i, j)\) 贡献 \([i + 1, N]\) 部分的答案只需让 \(v_j\) 在更新前做出贡献。
4.3 对于每组物品至多只能选一个的分组式 01 背包如何 dp ?
依然考虑 dp[i][j] 的组合意义是前 \(i\) 组不超过 \(j\) 的价值,其在这个状态空间下显然能且仅能对 dp[i + 1][j + w[i + 1, k]] + v[i + 1, k] 做出贡献,\(k\) 是第 \(i + 1\) 组的某个物品索引。