20241009做题记录
[BJOI2014] 路径
题意:给定一张无向图,每个点有一个字符 \(c\) 作为点权,\(\sum = \{+,\ -,\ \times ,\ /,\ 0 \sim 9,\ (,\ )\}\)。
求长度为 \(k\) 的路径数量,使得路径上的字符连起来是合法的算术表达式。\(n\le 20,\ k \le 30\)。
肯定是按路径长度一层一层 dp。
设 \(f(k, i, j)\) 表示长度为 \(k\),最后一个点在 \(i\),有 \(j\) 个左括号未匹配的未来可能合法路径数。
由于表达式中的数字不能有前导零,再开一维 \(0/1\) 表示能不能直接在后面接上一个数字即可(如果 \(i\) 是数字)。
[雅礼集训 2019 Day5] matrix
题意:定义一个矩阵的权值为其本质不同行的个数,两个行本质相同当且仅当他们完全相同。
给定一个 \(n \times m\) 的矩阵,求其所有子矩阵的权值和,\(n\times m \le 10^5\)。
钦定字符串 \(s\) 以及左右边界 \(l, r\),考虑行的集合 \(S = \{i \vert M_i(l, r) = s \} = \{a_1, a_2, \cdots, \ a_k\}\)。
对于每一个子矩阵,行 \(i\) 产生 \(1\) 的贡献当且仅当他在这个矩阵中第一次出现(从上往下遍历)。
因此整个 \(S\) 对答案的贡献为 \(\sum (a_{i} - a_{i - 1})(n - a_i + 1)\),\(a_0\) 视作 \(0\)。
枚举 \(s, l, r\) 是不可取的,不妨先钦定 \(l = 1\)。
对每行建出 trie 树,节点 \(p\) 对应一个矩阵中出现过的左端点为 \(1\) 的字符串。
对每个节点维护集合 \(S_p\),表示包含串 \(p\) 的行,可以在插入过程中同时维护每个 \(S_p\) 的贡献以及总贡献。
令 \(l\to l + 1\),这个操作会删掉根节点的所有儿子,并将所有孙子节点连接到根上。
启发式合并孙子节点的集合,时间复杂度 \(O\left(nm\log^{2}(nm)\right)\)。
合并两颗树的复杂度:如果其中一棵为空直接返回;否则会使整张图总点数减 \(1\),复杂度均摊线性。
[雅礼集训 2019 Day7] Inverse
题意:给定排列 \(\{p\}\),每次等概率挑选一个区间 \([l, r]\) 并翻转,求 \(k\) 次后的期望逆序对数。
数据范围:\(n \le 500,\ k \le 50\)。
设 \(f(k,l, r)\) 为 \(k\) 轮操作后 \(p_l > p_r\) 的概率,那么答案即:
设当前轮翻转 \([L, R]\):
-
\(\left(R < l\right) \lor \left(L > r\right) \lor\left(l < L \le R < r \right)\)。
\[\begin{aligned} &f^\prime(l, r) \gets \left(c_{l - 1}+ c_{n - r} + c_{r - l - 1}\right) \times f(l, r)\\ \\ &c_i = \frac{i(i + 1)}{2}\\ \end{aligned} \] -
\(L \le l \le R < r\)。
\[\begin{aligned} f^{\prime}(l, r) &\gets \sum_{L = 1}^l\sum_{R = l}^{r - 1}f(R + L - l, r)\\ \\ &\gets \sum_{L = 1}^l\sum_{i =0}^{r - l - 1}f(L + i, r)\\ \\ &\gets \sum_{L = 1}^l s_{0}(L + r - l - 1, r) - \sum_{L = 1}^ls_0(L - 1, r)\\ \\ &\gets s_0^{\prime}(r - 1,r) - s_0^{\prime}(r - l - 1,r) - s_0^{\prime}(l - 1,r) \end{aligned} \] -
\(l < L \le r \le R\)。
\[\begin{aligned} f^{\prime}(l, r) &\gets \sum_{L = l + 1}^r\sum_{R = r}^{n}f(l, L + R - r)\\ \\ &\gets \sum_{L = l + 1}^r\sum_{i = 0}^{n - r}f(l, L + i)\\ \\ &\gets \sum_{L = l + 1}^r s_{1}(l, L + n - r) - \sum_{L = l + 1}^r s_1(l, L - 1)\\ \\ &\gets s_1^{\prime}(l, n) - s_1^{\prime}(l, l + n - r) - s_1^{\prime}(l, r- 1) + s_1^{\prime}(l, l) \end{aligned} \] -
\(L \le l < r \le R\)。
\[\begin{aligned} f^{\prime}(l, r) &\gets \sum_{L = 1}^l\sum_{R = r}^{n} 1 - f(L + R - r, L + R - l)\\ \\ &\gets l\times(n - r + 1) - \sum_{L = 1}^l\sum_{i = 0}^{n - r}f(L + i, L + i + r - l)\\ \end{aligned} \]设 \(g(l, r) = f(l, l + r)\),则:
\[\begin{aligned} &\gets sum_{L = 1}^l\sum_{i = 0}^{n - r}g(L + i, r - l)\\ \\ &\gets\sum_{L = 1}^l s_2(L + n - r, r - l) - \sum_{L = 1}^ls_2(L - 1, r - l)\\ \\ &\gets s_2^{\prime}(l + n - r, r - l) - s_2^{\prime}(n - r, r - l) - s_2^{\prime}(l - 1, r - l) \end{aligned} \]
时间复杂度 \(O(n^2k)\)。submission
[雅礼集训 2019 Day7] Subsequence
题意:定义子序列 \(\{a_{p_1},\ a_{p_2},\ \dots,\ a_{p_{k}}\}\) 的权值为 \(\sum_{i = 1}^k i \times a_{p_i}\)。
给定数组 \(a\),对于每个长度 \(1 \sim n\),求出对应长度子序列的最大权值。\(n \le 10^{5}\)。
朴素 DP:\(f_{i, k}\) 表示前 \(i\) 个数长度为 \(k\) 的子序列的最大权值,\(f_{i, k} \gets \max(f_{i - 1, k}, f_{i - 1, k - 1} + k \times a_i)\),复杂度 \(O(n^2)\)。
[雅礼集训 2019 Day8] union
题意:给出 \(n\) 个点,\(i, j\) 有 \(a_{i, j}\) 种不同的连边方式。求本质不同无向连通图个数。
设 \(g_S\) 表示点集 \(S\),不管他连不连通的全部方案:
设 \(f_S\) 表示点集 \(S\) 连通的方案数。
枚举 \(S\) 所包含最小元素 \(x\) 所在连通块 \(T\):
这样转移的坏处在于需要额外判断 \(x \in T\),不妨设
那么
写成子集卷积的形式:
这里的 \(g^\prime\) 就是对于全集而言的了。
子集卷积(集合无交并)
\(f = g * h\),满足:
两个集合无交当且仅当 \(\vert S\vert + \vert T \vert = \vert S\cup T\vert\)。
令 \(G_{i, S} = \big[\vert S\vert = i\big]\times g_S\):
有 \(f_S = [x^Sy^{\vert S\vert}]\)。
对每行做莫比乌斯变换:
\(\cdot\) 表示对应位相乘。
枚举 \(i, j\),将 \(\hat G_i \cdot \hat H_j\) 的结果加到 \(\hat F_{i + j}\) 上,时间复杂度 \(O(n^22^n)\)。
子集逆卷积
求 \(f\) 在子集卷积意义下的逆元 \(g\)。
其中单位元 \(e\) 满足 \(e_i = [i = 0]\)。
首先 \(\hat E_0 = \hat F_0 \cdot \hat G_0\implies \hat G_{0, i} = \hat F_{0, i}^{-1}\)(因为 \(\hat E_{0, i} = 1\))。
\(\hat E_i = \hat F_0 \cdot \hat G_i + \sum_{j > 1} \hat F_j \cdot \hat G_{i - j}\),在前 \(i - 1\) 行已知的情况下能够递推出 \(\hat G_i\)(不难发现每位独立)。
[雅礼集训 2019 Day8] traffic
题意:给定一棵以 \(1\) 为根的树,\(n \le 10^5\)。
对于每个节点 \(u\),将 \(u\) 删去,并可以改变一个节点的父亲(不能是根和 \(u\) 的儿子),求最小化剩余连通块最大值。
贪心的考虑,肯定是将最大连通块 \(M\) 的某棵子树接到最小连通块上,因此答案的下界为次大连通块。
二分答案,判定最终结果是否有可能 \(\le \text{mid}\)。
目标转化为判断 \(M\) 中是否存在一棵大小属于 \([\text{mx - mid},\ \text{mid - mi}]\) 的子树(\(\max(\text{mx} - \Delta, \text{mi} + \Delta) \le \text{mid}\))。
线段树合并维护子树 size。
-
如果 \(M\) 为 \(u\) 的子树,直接在 \(M\) 的线段树中查询。
-
如果 \(M\) 为根所在连通块,做一个简单容斥:
\[\text{全局}[L, R] - {u\text{ 的子树}}[L, R] - {fa_u \text{ 到根的链}} [L, R] + {fa_u \text{ 到根的链}} [L + sz_u,\ R + sz_u] \]
注意合并子树的时刻即可。
\(fa_u\) 到根的信息可用树状数组在 dfs 的同时维护。submission