9.22 NTF 集训队讲题
【清华集训 2014】主旋律
题意
给定一个 \(n\) 个点 \(m\) 条边的简单有向图,求所有边的子集中,有多少个满足这个保留这个边集后图强连通。
\(n \le 15\),提交地址:https://uoj.ac/problem/37。
分析
设 \(f_s\):只考虑点集 \(s\),图强连通的方案数。正难则反,考虑算不强联通的,显然这样能将原图分为若干个强连通分量组成的 DAG,考虑分层剥叶子。
容易算重,于是容斥,设 \(g_s\):点集 \(s\) 组成若干强连通分量的方案数(带容斥系数)。考虑 \(g\) 转移:枚举子集 \(t\),则有 \(g_s \gets -f_t g_{s - t}\)。
设 \(d_s\):点集 \(s\) 的导出子图的边数,\(d_{s \to t}\):点集 \(s\) 中的点连向 \(t\) 中的点的边数。则有 \(f_s \gets g_t 2^{d_{s - t}} 2^{d_{t \to (s - t)}}\)。
时间复杂度 \(\mathcal O(3 ^ n)\)。
Code
提交记录:https://uoj.ac/submission/655841。
IOI2023 集训队互测 R3T1 整数
题意
给定长度为 \(2^n\) 的 01
序列 \(\{b_i\}\)。定义长度为 \(n\) 的序列 \(\{a_i\}\) 是好的,当且仅当在每一个二进制为 \(k\) 下,\(a\) 这一位拼接的二进制数满足 \(b_s = 1\)。给定上界,求 \(a\) 的数量。
\(n \le 18, r_i \le 2^{60}\),提交地址:https://qoj.ac/problem/5019。
分析
考虑数位 DP,从前往后推,设 \(f_s\):集合 \(s\) 违反上界的方案数;所求即为 \(f_{\emptyset}\)。
假设考虑到第 \(j\) 位,按 \(r_{i,j}\) 分类:
- \(r_{i, j} = 0\):仅当 \(a_{i,j}\) 为 \(1\) 时违反,否则不变;
- \(r_{i,j} = 1\):仅当 \(a_{i,j}\) 为 \(0\) 时不违反,否则不变。
发现相当于对于这一位 \(r_{i,j}\) 为 \(0\) 时或卷积,\(1\) 时与卷积。FWT 即可。
时间复杂度 \(\mathcal O(2^n n \log r)\)。
Code
提交记录:https://qoj.ac/submission/187683。
IOI2023 集训队互测 R15T1 翻修道路
题意
给定一个 \(n\) 个点 \(m\) 条边的有向图,每条边边权 \(a_i\),或通过操作使之变成 \(b_i\)(保证 \(1 \le b_i \le a_i\))。给定 \(k\) 个关键点,对于 \(x = 1, \dots m\),操作至多 \(x\) 次,\(1\) 到关键点距离的最大值的最小值。
\(n, m \le 100, k \le 8\),提交地址:https://qoj.ac/problem/5175。
分析
考虑在最短路树上 DP,设 \(f_{u, i, s}\):从 \(u\) 开始,操作 \(i\) 次,已包含关键点集合 \(s\) 的最大值最小值。
转移与斯坦纳树类似,从 \((v, i, s) \to (u, i/i+1,s/s \ \cup {u})\),或在同一子树中合并集合,时间复杂度 \(\mathcal O(m2^k \times m\log m)\)。
Code
提交记录:https://qoj.ac/submission/188438。
「THUSCH 2017」巧克力
题意
给定 \(n \times m\) 的表格,每个格子有权值和颜色(为 \(-1\) 就是不能选)。问最小的四连通块使得其中包含至少 \(k\) 中颜色,以及此基础上中位数的最小值。
\(n \times m \le 233, k \le 5\)。
分析
假设只有 \(k\) 种颜色,那直接将表格想象成图,让后设 \(f_{u, s}\):你在 \(u\),已收集到颜色集合 \(s\) 的最小连通块大小,套用斯坦纳树转移即可。考虑中位数就直接二分答案,然后在记录第二维小于 \(mid\) 减大于 \(mid\) 的最小值即可。
考虑随机分组解决多种颜色的问题,发现只需每组颜色出现在不同组中至少一次即可,\(100\) 多次就行了。
时间复杂度 \(\mathcal O(T3^knm\log(nm)\frac{k^k}{k!})\)。
Code
提交记录:https://loj.ac/s/1895842。
IOI2023 集训队互测 R8T1 环覆盖
题意
给定 \(n\) 个点 \(m\) 条边的简单有向图,对于每个 \(i \in [0, m]\),计算保留 \(i\) 条边,原图为一个边仙人掌的方案数。
\(1 \le n \le 25\),提交记录:https://qoj.ac/problem/5089。
分析
考虑即要求存在欧拉回路,所以要求每个点度数为偶数,将一条边看成一个点集合,那么相当于求对称差为 \(\emptyset\) 的方案数。
考虑对于每条边转化为集合幂级数 \(f_i(x,y) = 1 + x^{\{u_i,v_i\}}y\),令 \(F(x,y)=\prod f_i(x,y)\),所求即为 \([x^{\emptyset}y^i]F(x,y)\),考虑对 \(x\) 这一维进行 FWT,考虑 FWT 的意义是完全在一个集合内的边数减去一边在其中的边数,所以每一项形如 \(1 \pm y\),所以答案对所有 \(s\) 统计 \((1 - y)^{a_s}(1 + y)^{m - a_s}\)。
IFWT 的第 \(\emptyset\) 就相当于所有这样的多项式的和,直接使用组合数计算,时间复杂度 \(\mathcal O(2^n + m^2)\)。
Code
提交记录:https://qoj.ac/submission/188116。
CF1149D Abandoning Roads
题意
给定 \(n\) 个点 \(m\) 条边的无向联通图,只有 \(a,b\) 两种边权(\(a < b\))。考虑这张图中的所有最小生成树,对于每个 \(i\),求 \(1\) 到 \(i\) 在所有最小生成树中的最小距离。
\(n \le 70, m \le 200\),提交地址:https://codeforces.com/problemset/problem/1149/D。
分析
考虑那些边可能出现在最小生成树中:
- 所有 \(a\) 边(不成环);
- 链接由 \(a\) 边组成的连通块的 \(b\) 边。
考虑将所有 \(a\) 边提取出来缩点,让后只要在跑最短路时不会到同一个点即可。发现对于大小小于等于 \(3\) 的连通块,无论如何都不可能走回头路,所以只需要记录大小大于 \(3\) 的连通块是否到达过,跑分层图最短路,即可。
时间复杂度 \(\mathcal O(2^{\frac{n}{4}} m\log m)\)。
Code
提交记录:https://codeforces.com/contest/1149/submission/225192424。
CF1261F Xor-Set
题意
给定集合 \(A,B\),求 \(C = \{x | x = a \bigoplus b, a \in A, b \in B\}\) 的所有元素的和。集合有若干个区间给出。
\(1 \le n, m \le 100, 1 \le l_i \le r_i \le 10^{18}\),提交地址:https://codeforces.com/problemset/problem/1261/F。
分析
考虑将区间按二进制位拆开,若一个长度 \(2^x\) 的区间和长度为 \(2^y\) 的区间合并(\(x \le y\)),那么结果会是一个长度为 \(2^y\) 的区间,高位有两个区间的高位异或起来决定。区间数太多,不能接受。
考虑到,对于从同一个区间中衍生出的所有长度 \(2^x\),且 \(x \le y\) 的子区间,它们与较长区间的异或结果相同,所以就没必要了,所以每个区间唯一对应一个区间,区间并即可。
时间复杂度 \(\mathcal O(mn\log^2V)\)。
Code
提交记录:https://codeforces.com/contest/1261/submission/225197423。
CF1062F Upgrading Cities
题意
给定 \(n\) 个点 \(m\) 条边的 DAG,问有多少个 \(u\),满足:至多存在一个 \(v\),\(u \not \to v \land v \not \to u\)。
\(n, m \le 3 \times 10^5\),提交地址:https://codeforces.com/problemset/problem/1062/F。
分析
考虑拓扑排序后,令 \(u \gets id_u\),\(id_u\) 为 \(u\) 拓扑排序后的编号。
考虑分 \(< u\) 和 \(> u\) 两部分分析,以小于为例。对于一个 \(v < u\),若存在 \(w < u, (v, w) \in E\),那么 \(v \not \to u\) 可以推出 \(w \not \to u\),那么判断 \(v\) 无意。
设 \(r_u = \min\{v | (u, v) \in E\}\),那么所有 \(< u\) 的点能到达 \(u\) 相当于 \(\forall v < u, r_v \le u\)。
那么原问题相当与若只存在一个 \(v < u\) 满足 \(r_v > u\),则将它删去后重新检查,删掉 \(v\) 会使所有以 \(v\) 为最小出边的点,记 \(R_v\) 表示次小值即可。
时间复杂度 \(\mathcal O(n + m)\)。
Code
提交记录:https://codeforces.com/contest/1062/submission/225203501。
CF715E Complete the Permutations
题意
给定两个排列 \(\{p_n\}, \{q_n\}\)(有部分位置未知),定义 \(p, q\) 的距离为不断交换 \(p\) 中的两个数,使得 \(p, q\) 相同的最小交换次数。求 \(i := 0, \dots n -1\),\(p, q\) 距离恰好为 \(i\) 的方案数。
\(n \le 250\),提交记录:https://codeforces.com/problemset/problem/715/E。
分析
首先考虑两个排列的距离就是 \(p_i \to q_i\) 连边后图的 \(n - c\),\(c\) 为环数,考虑计数不同的图。
考虑将图分为 \(4\) 类:
- \(p \to q\);
- \(p \to 0\);
- \(0 \to q\);
- \(0 \to 0\)。
若存在 \(0 \to x, y \to 0 \land x = y\),则将其合并为一个四类边。一类边可以缩点,注意判断是否成环。
设 \(n_1, n_2, n_3\) 分别表示二类,三类和四类的边数。
那么考虑计数二类边形成 \(i\) 个环的方案数:
意义是一条二类边的归宿要么是成环,要么是将二类链和四类链合并,四类边同理。
四类边形成 \(i\) 个环的方案数不难发现为:
因为这些边可以任意选择。
剩下的部分直接卷积起来。
时间复杂度 \(\mathcal O(n^2)\)。
Code
提交记录:https://codeforces.com/contest/715/submission/225221642。