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\) 是数字)。

submission

[雅礼集训 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\),复杂度均摊线性。

submission

[雅礼集训 2019 Day7] Inverse

题意:给定排列 \(\{p\}\),每次等概率挑选一个区间 \([l, r]\) 并翻转,求 \(k\) 次后的期望逆序对数。

数据范围:\(n \le 500,\ k \le 50\)

\(f(k,l, r)\)\(k\) 轮操作后 \(p_l > p_r\) 的概率,那么答案即:

\[\sum_{l = 1}^{n} \sum_{r = l + 1}^n f(k, l, r) \]

设当前轮翻转 \([L, R]\)

  1. \(\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} \]

  2. \(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} \]

  3. \(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} \]

  4. \(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\),不管他连不连通的全部方案:

\[g_S = \prod_{i < j \in S} (a_{i, j} + 1) \]

\(f_S\) 表示点集 \(S\) 连通的方案数。

枚举 \(S\) 所包含最小元素 \(x\) 所在连通块 \(T\)

\[g_{S} = \sum_{x \in T, T \subseteq S} f(T)\times g(S\setminus T) \]

这样转移的坏处在于需要额外判断 \(x \in T\),不妨设

\[g^{\prime}_S = \begin{cases} g_S & x \notin S\\ 0 & x \in S \end{cases} \]

那么

\[g_S = \sum_{T \subseteq S} f(T)\times g^{\prime}(S \setminus T) \]

写成子集卷积的形式:

\[\begin{aligned} g &= f* g^{\prime}\\ f &= g * \left(g^{\prime}\right)^{-1} \end{aligned} \]

这里的 \(g^\prime\) 就是对于全集而言的了。

submission


子集卷积(集合无交并)

\(f = g * h\),满足:

\[f_S = \sum_{T \subseteq S} g_T \times h_{S\setminus T} \]

两个集合无交当且仅当 \(\vert S\vert + \vert T \vert = \vert S\cup T\vert\)

\(G_{i, S} = \big[\vert S\vert = i\big]\times g_S\)

\[F_{i, S} = \sum_{j + k = i\land T\cup R = S} G_{j, T} \times H_{k, R} \]

\(f_S = [x^Sy^{\vert S\vert}]\)

对每行做莫比乌斯变换:

\[\hat F_i = \sum_{j + k = i} \hat G_j \cdot \hat H_k \]

\(\cdot\) 表示对应位相乘。

枚举 \(i, j\),将 \(\hat G_i \cdot \hat H_j\) 的结果加到 \(\hat F_{i + j}\) 上,时间复杂度 \(O(n^22^n)\)

子集逆卷积

\(f\) 在子集卷积意义下的逆元 \(g\)

\[f * g = e \]

其中单位元 \(e\) 满足 \(e_i = [i = 0]\)

\[\hat E_i = \sum_{j + k = i} \hat F_j \cdot \hat G_k \]

首先 \(\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

posted @ 2024-10-09 20:59  Lu_xZ  阅读(32)  评论(1编辑  收藏  举报