目录
- 0.「NOI Simu.」游戏 ⭐
- 1.「NOI Simu.」海盗 ⭐
- 2.「集训队作业 2020-2021」「LOJ #3405」Gem Island 2 ⭐
- 3.「UR #12」「UOJ #181」密码锁 ⭐
- 4.「UR #25」「UOJ #805」设计草图
- 5.「UR #25」「UOJ #806」见贤思齐 ⭐
- 6.「NOI Simu.」哈密顿路
- 7.「NOI Simu.」统一省选
- 8.「NOI Simu.」并行计算 ✡️
- 9.「NOI Simu.」游戏 ⭐
- 10.「NOI Simu.」模拟赛
- 11.「NOI Simu.」MOMO ✡️
- 12.「HDU #6636」Milky Candy
- 13.「Gym 102156D」Pick Your Own Nim
- 14.「UR #11」「UOJ #168」元旦老人与丛林 ⭐
- 15.「洛谷 P9347」似曾相识燕归来
这篇 sol set 很长哟~
0.「NOI Simu.」游戏 ⭐
- Private link | 你放 MTT 兔就君子动口不动手了.
- 「A.数学-多项式」「B.复杂度平衡」
非法条件是不存在长度至少为 \(\ell=2k-1\) 的同色段, 显然计数这个非法序列数量更方便. 初等地, 设 \(f_i\) 表示长度为 \(i\) 的非法序列数量, 我们有
\[f_i=\begin{cases} m^i,&i<\ell\\ (m-1)\sum_{j=1}^{\ell-1}f_{i-j},&i\ge\ell \end{cases}. \]一方面, 对于 \(f\), 我们可以 \(\mathcal O(\ell\log\ell\log n)\) 地大力 Bostan-Mori 算远项. 另一方面, 引入 GF, 可以发现
\[\begin{aligned} F(z) &= \frac{m}{m-1}\sum_{i\ge 0}\left(\frac{(m-1)(z-z^{\ell})}{1-z}\right)^i \\ &= \frac{m}{m-1}\cdot\frac{1-z}{1-z-(m-1)(z-z^{\ell})}, \end{aligned} \]考虑系数提取. 设 \(g_n=[z^n]\frac{1}{1-z-(m-1)(z-z^{\ell})}\), 那么
\[\begin{aligned} g_n &= [z^n]\sum_{i\ge0}(z+(m-1)(z-z^{\ell}))^i \\ &= [z^n]\sum_{i\ge0}z^i(m-(m-1)z^{\ell-1})^i\\ &= \sum_{t\ge0}\binom{n-t(\ell-1)}{t}m^{n-t\ell}(1-m)^t. \end{aligned} \]组合数可以 Lucas 求, 那么这样可以得到一个 \(\mathcal O(p+\frac{n}{\ell}\log_p n)\) 的算法. 上下平衡一下复杂度就能得到正解. 当然, 似乎可以强行暴力卷积, 将更大的计算量放到第二种算法上.
1.「NOI Simu.」海盗 ⭐
- Private link & Submission.
- 「A.DP-凸函数维护」「B.Tricks」
不难发现, 我们可以通过描述 \(i\) 和 \((i+1)\bmod n\) 之间传递的金币数量 \(x_i\in\mathbb Z\) 来描述一种方案. 先假设 \(x_{n-1}=0\), 设 \(f(i,x)\) 表示 \([0,i]\) 内的所有海盗已经合法, \(i\) 向 \(i+1\) 传递的金币数量为 \(x\) 时的最小代价, 那么
\[f(i,x)=\min\{f(i-1,x')+|x|~\big|~x'\in[l_i+x-a_i,r_i+x-a_i]\}. \]从维护函数 \(f_i(x)\) 的角度思考, 从 \(f_{i-1}(x)\to f_i(x)\), 我们进行了如下变换:
- 取 \(f_i(x)=\min\{f_{i-1}(x+t)\mid t\in[0,r_i-l_i]\}\).
- 将 \(f_i(x)\) 整体向左平移 \(l_i-a_i\) 个单位.
- 令 \(f_i(x)\gets f_i(x)+|x|\).
注意 \(|x|\) 的凸性, 这提示我们可以用 slope trick 维护这个函数. 具体来说, 用两个堆负斜率突变点和正斜率突变点. 前两个操作都比较简单, 第三个操作, 设函数斜率从 \(-1\) 突变向 \(0\) 的位置是 \(x=p\), 从 \(0\) 突变向 \(1\) 的位置是 \(x=q\), 讨论:
- 若 \(p\le 0\le q\), 两个堆各自加入一个 \(0\).
- 若 \(0<p\), 此时 \(p\) 将进入正斜率突变的范围, 将 \(p\) 取出加入另一个堆, 然后在负斜率堆中加入两个 \(0\).
- 若 \(q<0\), 类似.
这样单次可以做到 \(\mathcal O(n\log n)\).
如何破环? 自然的想法是枚举 \(x_{n-1}\). 可以证明答案关于 \(x_{n-1}\) 的函数 \(g(x)\) 仍然是凸函数, 这样就能 \(\mathcal O(n\log n\log \sum a_i)\) 求解了.
证明
首先, 不妨把 $\{x_n\}$ 的定义域扩大到 $\mathbb R^n$. 利用整数费用流的最优解可以是整数的性质, 这并不会影响答案.设 $P=\{p_0,p_1,\cdots,p_{n-1}\}$ 和 $Q=\{q_0,q_1,\cdots,q_{n-1}\}$ 是让各自的 $g(x)$ 取到最小值的一种方案, 我们只需要说明 $R=(P+Q)/2$ 是一组合法方案, 且 $R$ 的代价不超过 $(g(p_{n-1})+g(q_{n-1}))/2$ 即可. 这里简单计算一下即可证明, 接下来思路比较明确, 就略过了. $\square$
2.「集训队作业 2020-2021」「LOJ #3405」Gem Island 2 ⭐
- Link & Submission.
- 「A.数学-组合计数」「A.数学-数学推导」
(\(d\to m\), \(r\to k\), 你这变量名太怪了.)
前 \(k\) 大? 钦定排名什么的不太好做, 我们可以尝试在值域上求解. 例如, 在一个固定的方案中, 设 \(c_i\) 表示值 \(\ge i\) 的个数, 那么该方案的贡献是 \(\sum_{i\ge1}\min\{c_i,k\}\).
设 \(g(a,i)\) 表示钦定了 \(i\) 个位置的值 \(\ge a\) 的方案数, 显然:
\[g(a,i)=\binom{n}{i}\binom{m-(a-1)i+n-1}{n-1}. \]对应地设 \(f(a,i)\) 表示恰好 \(i\) 个位置的值 \(\ge a\) 的方案数, 反演出:
\[f(a,i)=\sum_{j\ge i}(-1)^{j-i}\binom{j}{i}g(a,j). \]继而, 我们可以表示出答案:
\[\textit{ans}=\sum_{a\ge1}\sum_{i\ge0}f(a,i)\min\{i,k\}. \]这个式子带着 \(f\) 算就很没前途, 接下来我们还是得拆开 \(f\) 化简.
\[\begin{aligned} \textit{ans} &= \sum_a\sum_i\left(\sum_{j\ge i}(-1)^{j-i}\binom{j}{i}g(a,j)\right)\min\{i,k\}\\ &= \sum_a\sum_j(-1)^jg(a,j)\sum_{i\le j}(-1)^i\binom{j}{i}\min\{i,k\}. \end{aligned} \](你这啥也没化简啊?) \(g\) 是可算的, 我们重点优化最后一个求和. 直接来嘛:
\[\begin{aligned} h(m) &= \sum_{i\le m}(-1)^i\binom{m}{i}\min\{i,k\}\\ &= \sum_{i=0}^{k}(-1)^i\binom{m}{i}i+k\sum_{i=k+1}^{m}(-1)^i\binom{m}{i}\\ &= [z^k]\frac{\vartheta(1-z)^m}{1-z}-k[z^k]\frac{(1-z)^m}{1-z}\quad(m>0)\\ &= m(-1)^k\binom{m-2}{k-1}-k(-1)^k\binom{m-1}{k}\quad(m>1)\\ &= (-1)^k\binom{m-2}{k-1}. \end{aligned} \](呜… 重名了, 上式的所有 \(m\) 与全局的 \(m\) 无关.) 到此, 我们欲求
\[\begin{aligned} \textit{ans} &=\sum_{a=1\lor j=1}\cdots+\sum_{a>1}\sum_{j>1}(-1)^{j+k}\binom{j-2}{k-1}g(a,j)\\ &= \cdots+\sum_{a>1}\sum_{j>1}(-1)^{j+k}\binom{j-2}{k-1}\binom{n}{j}\binom{m-(a-1)j+n-1}{n-1}\\ &= \cdots+\sum_{t=1}^m\binom{m-t+n-1}{n-1}\sum_{j\mid t\land j>1}(-1)^{j+k}\binom{j-2}{k-1}\binom{n}{j}\\ &= \cdots+\sum_{j=2}^n(-1)^{j+k}\binom{n}{j}\binom{j-2}{k-1}\sum_{j\mid t}\binom{m-t+n-1}{n-1}. \end{aligned} \]最后一个和式可以高维前缀和, 这样我们得到了 \(\mathcal O(n\log\log n)\) (\(n,m\) 同阶) 的算法.
3.「UR #12」「UOJ #181」密码锁 ⭐
- Link & Submission.
- 「A.DP-状压/插头 DP」
竞赛图的缩点后一定是满足每个点都向后面所有点连边的链, 这都不知道的吗…
因此, 我们只需要计数非空割集的数量. 若不考虑特殊的边, 割 \((S,U\setminus S)\) 出现的概率是 \(2^{-|S|(n-|S|)}\), 因为特殊边很少, 我们尝试在此基础上更正特殊边的概率贡献. 可见, 若一条特殊边取 \(U\setminus S\to S\) 方向的概率是 \(p\), 则它应该带来更正因子 \(2p\). 而特殊边的情况只与 \(S\) 和该特殊边参与形成的连通块 \(B\) 的交集 \(S\cap B\) 有关. 我们只需要对每个 \(B\) 的子集 \(X\), 求出 \(S\cap B=X\) 的更正因子, 背包合并出 \(S\) 的所有情况下更正因子乘积之和, 再用无特殊边的方法计算答案即可. 复杂度 \(\mathcal O((m+n)2^m)\).
4.「UR #25」「UOJ #805」设计草图
- Link & Submission.
不难发现, 某个子串 \(S[l:r]\) 合法, 当且仅当:
- \(2\mid(r-l+1)\).
- 将所有 \(\chr ?\) 替换为 \(\chr (\) 后, 子串所有前缀均满足 \(\chr (\) 个数不少于 \(\chr )\) 个数.
- 将所有 \(\chr ?\) 替换为 \(\chr )\) 后, 子串所有后缀均满足 \(\chr )\) 个数不少于 \(\chr (\) 个数,
后两个限制相对独立, 我们考虑求出 \(L_i\) 和 \(R_i\), 分别表示从 \(i\) 开始, 满足两个条件的最远端点, 这个可以栈模拟一下括号匹配求. 此后就 BIT 贡献答案即可. \(\mathcal O(n\log n)\).
5.「UR #25」「UOJ #806」见贤思齐 ⭐
- Link & Submission.
- 「A.数据结构-可持久化线段树」「B.倍增」
先胡一下赛上胡的东西. 考虑 subtask 3, 我们尝试对每个元素 \(a_i\) 维护其变化序列 \(S_i=[s_{i,0},s_{i,1},\cdots]\), 使得 \(a_{i,t}=a_i+\sum_{j<t}s_{i,j}\). 可以发现, \(S_n=[1]^{+\infty}\). 有了这个边界, 我们只需要考虑 \(S_{p_i}\) 向 \(S_i\) 的更新过程.
在漫漫时间长河中, 一定存在一个时刻 \(t\), 有 \(a_{i,t}=a_{p_i,t}\), 此后两个数的变化都是 "若 \(a_{p_i}\) 在当前时刻 \(+1\), 则 \(a_i\) 在下一时刻 \(+1\)", 也就是说, 大体上, \(S_i\) 是 \(S_{p_i}\) 向右平移一个位置的结果. 在这个 \(t\) 时刻之前的部分就是简单的全部 \(+1\) 或者全部不变, 也不难维护. 我们用一个持久化线段树维护所有序列即可. 在 \(a_{i,0}>a_{p_i,0}\) 时, 需要实现一个线段树二分来找 \(t\).
全局情况, 我们需要处理的是内向基环树. 显然环上最小值也是 \([1]^{+\infty}\), 从这个位置出发就能推出其他所有点的 \(S\) 了, 复杂度是同样的 \(\mathcal O((n+q)\log n)\).
不想写? 看看 zak 的做法吧家人们!
考虑最基本的递推形式, \(a_{i,t}=\min\{a_{i,0}+t,\max\{a_{i,0},a_{p_i,t-1}+1\}\}\), 虽然正确性不言而喻, 但这样的递推可以规避掉一些分枝判断, 更便于优化. 如果我们对递推式中的 \(a_{p,t-1}\) 进行迭代, 我们就会得到一系列 \([a_{i,0},a_{i,0}+t']\) 的区间来约束 \(a_{i,t}\) 的上下界. 我们直接倍增求出区间嵌套关系第一次被破坏的位置, 就能求出答案了. 复杂度还是 \(\mathcal O((n+q)\log n)\).
6.「NOI Simu.」哈密顿路
比较脑筋急转弯的题. 注意图是无向图, 因而哈密顿路可以通过从某个特定点出发的两条点不交路径生成. 不妨取一个特殊点 \(s\), 求出 \(f(S)\) 表示从 \(s\) 出发经过集合 \(S\) 内的点时, 可以以哪些点作为终点, 直接枚举下一步就能转移. 最后用所有 \(f(S)\) 和 \(f(U\setminus S)\) 贡献答案即可. 复杂度 \(\mathcal O(n2^n)\).
7.「NOI Simu.」统一省选
- Private link & Submission.
- 「A.数据结构-线段树」
注意到所有的单个关卡都可以表示成进入血量 \(x\) 和离开血量 \(y\) 的函数 \(f:x\mapsto y\), 满足
\[f(x)=\begin{cases} 0, & x\le x_0\\ y_0, & x_0<x\le x_1\\ y_0+x-x_1, & x_1<x \end{cases}. \]而这种分段函数相互复合, 得到的函数仍然具有同样的形式. 讨论复合结果时, 可以讨论内层的 \(y_0\) 与外层的 \(x_0,x_1\) 的位置关系, 情况并不多. 线段树维护所有区间的函数即可, \(\mathcal O(n+q\log n)\).
8.「NOI Simu.」并行计算 ✡️
- Private link & Submission.
- 「A.构造」「C.性质/结论」
这题很麻烦的点在于需要构造步数严格最小的方案, 我们必须得找到一个紧的下界, 才有构造的目标.
比较简单的一个界是 \(\lceil\log_2 n\rceil\), 毕竟我们总得构造一个长度为 \(n\) 的序列出来.
接下来, 我们通过描述 "合法且优秀的操作" 的性质, 得到另一个下界.
首先, 可以发现, 我们任何时候得到的序列都应该有着连续的值, 即恰好包含某个区间 \([l,r]\) 内的所有整数. 此外, 我们也没有必要将同一个序列多次造出. 据此, 我们可以建出一张图, 图中结点代表某个 \([l,r]\), 若 \(u\) 不是叶子, 则其应当有两条入边 \(\lang x,u\rang,\lang y,u\rang\), 表示我们通过 \(x+y\) 得到 \(u\). 这样, 我们得到了一个 DAG.
接下来又是 key 但不知道 motivation 的东西: 我们考虑所有可达 \([1,n]\) 的结点, 它们的诱导子图构成一棵内向树 \(T\), \(T\) 显然共有 \(n\) 个叶子, \(n-1\) 个非叶结点, 每个非叶结点都恰好有两个儿子, 各结点的区间或离或含. 设 \(A\) 为树中 \([1,i]\) 的数量, 注意到我们在得到 \([1,i]\) 时, 必然需要先得到某个 \([1,j]\) 和 \([j+1,i]\), 据此可知我们一次只能合成一个 \([1,i]\) (否则, 原材料中必然有相交而不相含的区间). 设操作次数为 \(L\), 我们得到 \(L\ge A-1\).
然后考虑树外, 树外还有 \(n-A\) 个 \([1,i]\), 我们至少也需要 \(n-A\) 个单元操作来生成它们. 设 \(S\) 为单元操作数量, 结合树内树外, 我们得到 \(S\ge n-A+n-1=2n-1-A\), 则 \(L\ge A-1\ge 2n-S-2\), 同时显然有 \(L\ge\lceil S/4\rceil\), 因此 \(L\ge\max\{\lceil S/4\rceil,2n-S-2\}\ge\lceil\frac{2n-2}{5}\rceil\).
到此, 我们得到了一个 \(L\ge\max\{\lceil\log_2n\rceil,\lceil\frac{2n-2}{5}\rceil\}\) 的界.
爆搜出 \(n\le16\) 的最优解, 对于 \(n>16\) 的部分, 用 \(n=16\) 的解不断压缩, 可以得到 \(\frac{6n}{16-1}+\mathcal O(1)\) 的解, 大力调整最后的 corner 即可. 对于给出的数据, 大多再添加一个不少于剩下数个数的最优构造就能达到下界. 一个不平凡的情况是, 若剩下 \(21\) 个, 需要用 \(21\) 的最优解 (恰好可以是两个 \(11\) 的最优解拼起来) 而不能再用 \(16\) 压缩. 给出的构造顺便就完成了下界证明.
9.「NOI Simu.」游戏 ⭐
- Private link & Submission
- 「A.数学-组合计数」
第一问没手也行: 独立地考虑每个位置被选入方案的概率. 假设我们在所有合法方案中随机挑一个出来, 记事件 \(A_{i,j}\) 表示 \((i,j)\) 存在在这个方案中的概率, 那么
\[\Pr(A_{i,j})=\frac{1}{ij}. \]很显然, \((i,j)\) 左下方的矩形中必然存在一个在方案中, 第一次在这个矩形中选位置就选到 \((i,j)\) 的概率即 \(\Pr(A_{i,j})\). 最终答案即 \(h_n\times h_m\), 其中 \(h_k\) 即调和级数第 \(k\) 项. 复杂度 \(\mathcal O(\max\{n,m\})\).
第二问就有点哇塞了. 经过一些尝试, 我们发现我们几乎只会描述 \(\Pr(A_{i,j})\), 甚至连总方案数都不是很好求, 更不要说 DP 求答案了. 如何用这个概率描述答案? 设 \(P\) 是方案集合, \(p\in P\), 可以想到
\[\begin{aligned} E(|p|^2) &= \frac{1}{|P|}\sum_{p\in P}\sum_{(i_1,j_1)\in p}\sum_{(i_2,j_2)\in p}1\\ &= \sum_{(i_1,j_1)}\sum_{(i_2,j_2)}\frac{1}{|P|}\sum_{p\in P}[(i_1,j_1)\in p][(i_2,j_2)\in p]\\ &= \sum_{(i_1,j_1)}\sum_{(i_2,j_2)}\Pr(A_{i_1,j_1}A_{i_2,j_2}). \end{aligned} \]好消息是, 我们的确用单纯的概率描述了答案. 坏消息是, 这个概率咱还是不会求啊?
尝试引入一个构造性转化 (实际上兔是硬想的, 但加上这个转化的确会清晰很多). 我们考虑全体 \(n\times m\) 阶排列, 将它们填入网格图, 对于某个排列 \(\sigma\), 我们按照值升序枚举排列的元素, 若这个元素所处的位置没有被删除, 则将其加入方案序列, 这样就能得到 \(\sigma\) 所对应的方案 \(p_\sigma\). 我们惊讶地发现, 可重集 \(\varOmega=\{p_{\sigma}|\sigma\in S_{n\times m}\}\) 正是 \(P\) 正比于元素概率展开得到的古典概型的样本空间!
若 \((i_1,j_1)\) 和 \((i_2,j_2)\) 的左下矩形存在包含关系, 不妨设 \(i_1\le i_2\land j_1\le j_2\), 注意到这里有 \(\Pr(A_{i_1,j_1}\mid A_{i_2,j_2})=\Pr(A_{i_1,j_1})\), 因而此时
\[\Pr(A_{i_1,j_1}A_{i_2,j_2})=\Pr(A_{i_1,j_1})\Pr(A_{i_2,j_2})=\frac{1}{i_1j_1\cdot i_2j_2}. \]否则, 两点位置关系形如
我们要求 \(A\) 和 \(B\) 都在方案中, 这里就可以通过约束 \(\sigma_A\) 和 \(\sigma_B\) 来达成这一点. 不妨设 \(\sigma_A<\sigma_B\), 明显, \(\sigma_A\) 是阴影中所有数的最小值, 概率为 \(\frac{1}{i_1j_1+i_2j_2-\min\{i_1,i_2\}\min\{j_1,j_2\}}\), \(\sigma_B\) 是 \(B\) 矩形中的最小值, 放在排列上可以明显看出 \(\sigma_A\) 的约束不影响 \(\sigma_B\), 因此这里概率就是 \(\frac{1}{i_2j_2}\). 最终, 我们得到
\[\Pr(A_{i_1,j_1}A_{i_2,j_2})=\frac{1}{i_1j_1+i_2j_2-\min\{i_1,i_2\}\min\{j_1,j_2\}}\left(\frac{1}{i_1j_1}+\frac{1}{i_2j_2}\right). \]By-definition 的算法是 \(\mathcal O(n^2m^2)\) 的, 需要稍稍优化最后一个式子. 我们枚举 \(i_1<i_2\) 时的 \(i_2-i_1\), 预处理自然数倒数等间距求和的结果, 再枚举对应的 \((i_1,j_1)\) 和 \(j_2\) 贡献答案. 同理还需要枚举 \(j_1<j_2\) 时的 \(j_2-j_1\). 复杂度 \(\mathcal O(\max\{n,m\}nm)\).
10.「NOI Simu.」模拟赛
- Private link & Submission.
- 「A.数学-FWT」
水题放 T1 好不好? 水题放 T1 好不好? 水题放 T1 好不好? 水题放 T1 好不好? 水题放 T1 好不好?
可以鉴定出, 我们需要手算答案序列 \(A\) 的 or-卷积正变换结果 \(\hat A\), 直接展开有
\[\hat A_S=\prod_{i=1}^n\sum_{j=1}^kp_{i,j}[a_{i,j}\subseteq S]. \]鉴于 \(k\) 极小, 尝试讨论 \(T\in 2^{[1:k]}\) 对答案的贡献. 尝试构造容斥系数 \(f_T\) 使得
\[\prod_{\operatorname{mask}(T)\subseteq S}f_T=\sum_{j=1}^kp_{i,j}[a_{i,j}\subseteq S], \]其中 \(\operatorname{mask}(T)=\bigcup_{j\in T}a_{i,j}\). 这样前面的乘积就可以高维前缀积 (好怪的仿词) 求出来. 当然, 这里的构造也没什么难度:
\[f_T=\left(\sum_{j\in T}p_{i,j}\right)\big/\prod_{T'\subsetneq T}f_{T'}. \]除法通过 \(a=c\times0^k\) 形式即可在算数域内完成, 这样就 done 了. 暴力做是 \(\mathcal O(n3^k+m2^m)\) 的, 当然这个 \(f_T\) 也可以高维前缀商 (???) 求出来, 可以把前半部分优化到 \(\mathcal O(nk2^k)\).
11.「NOI Simu.」MOMO ✡️
- Private link & Submission.
- 「A.构造」
希望出题人不要在题解中写谜语.jpg
因为几乎是完全依赖题解做的, 所以讲解会很 unmotivated, 抱歉啦. 为方便阅读, 下划线字符记作 \(\chr /\)
先考虑如何对树构造. 下用 \(x\to y\) 表示从 \(x\) 到 \(y\) 的树上路径的点集 (注意, 含 \(x\) 但不含 \(y\)), \(p_u\) 表示 \(u\) 的父亲. 不妨以 \(1\) 为树根, 字符串内字符编号为 \(2\sim n\). 我们通过 \(d(u,v)=\sum_{x\in (u\to\lca(u,v))}1+\sum_{x\in (v\to\lca(u,v))}1\) 来构造答案. 令 \(S_1=\underline{\texttt{OO}\dots\texttt O}\), \(S_u=S_{p_u}\), 紧接着修改 \(S_{u,u}\gets\chr M\). 可见, 对于任意 \((u,v)\), \(S_u\) 和 \(S_v\) 不一样的位置就是 \(u\to v\) 中所有结点编号对应的字符.
推广到一般图上, 我们取出图的 BFS 树, 先在 BFS 树上进行上述算法得到一个初始答案. 不过两点 \(u,v\) 间的 BFS 树上距离可能大于原图上距离, 我们记这两个距离的差值为 \(\gap(u,v)\). 接下来通过引入 \(\chr /\) 来调整答案. 对于 \(\gap(u,v)=k>0\) 的 \(u,v\), 我们期望在 \(S_u,S_v\) 字符不同的位置引入总共 \(k\) 个不重合的 \(\chr /\), 如果所有点对都成功地引入了恰当数量的 \(\chr /\), 我们的构造就合法了.
我们先来研究 \(\gap(u,v)\) 的性质. 以下结论都是不言而喻的:
-
若 \(v\) 是 \(u\) 的树上祖先, 则 \(\gap(u,v)=0\).
-
设 \(w=\lca(u,v)\), 若 \(w\neq v\), 则 \(\gap(u,p_v)\le\gap(u,v)\le\gap(u,p_v)+2\).
由性质 1, 我们不应该去动 \(S_u\) 中 \(u\) 的祖先们对应的字符, 那就只好调整 \(v\to\lca(u,v)\) 中的点对应的字符了. 而又由性质 2, 最坏情况下, \(v\to\lca(u,v)\) 上只有 \(\lceil\gap(u,v)/2\rceil\) 个点, 这怎么办? 一个很好的 motivation 便是: 将从 \(1\) 数到 \(\gap(u,v)=:k\) 这 \(k\) 个自然数按奇偶性分开, 在 \(v\to\lca(u,v)\) 上尝试找到所有 \(1,3,\dots\) 的突变位置 (从 \(\gap(u,\cdot)<x\) 变化到 \(\gap(u,\cdot)\ge x\) 的最高的点), 在 \(S_u\) 中修改它们的字符; 同理, 在 \(u\to\lca(u,v)\) 上尝试找到所有 \(2,4,\dots\) 的突变位置 (从 \(\gap(v,\cdot)<x\) 变化到 \(\gap(v,\cdot)\ge x\) 的最高的点), 在 \(S_v\) 中修改它们的字符. 这样, 所有的突变位置一定都能够被找到, \(S_u,S_v\) 的构造就完成了!
最后一个点, 我们当然希望对所有 \((u,v)\) 都来这样构造, 但如何保证这些构造不会破坏彼此的合法性? 考虑所有影响到 \(S_u\) 的构造, 我们枚举一个 \(u\) 的祖先 \(w\), 然后再枚举 \(w\) 在外侧子树根 \(v\), 处理 \(S_u\) 在 \(v\) 子树内的字符. 可见, 只要 \(v\) 子树内的点关于 \(u\) 的构造全部都选择了 "奇数构造" 或者全部都选择了 "偶数构造", 就不会产生矛盾. "一棵子树选择相同"? DFN 嘛! 我们按照 \(u\) 和子树根 \(v\) 的 DFN 大小关系选择奇偶构造就行了.
复杂度 \(\mathcal O(n^3)\), 构造部分非常宽松, 怎么写都可以.
12.「HDU #6636」Milky Candy
- Link & Submission (因为离开高版本语法就不会写代码, 所以就在校内 OJ 交了).
- 「A.拟阵/拟阵交」
带权拟阵交捏! 秉承多得少不得的原则, 我们得把选择取个补集才能描述限制.
令 \(\mathcal M_1=(U,\mathcal I_1)\), 其中 \(U\) 即全体提示集合, \(S\in\mathcal I_1\) 当且仅当用 \(U\setminus S\) 中的提示能解出方程组. 遗传性显然, 交换性可以放到图上证明. 对于 \(A,B\in\mathcal I_1\) 且 \(|A|>|B|\), 我们一定能取出 \(U\setminus B\) 在图上的环, 使得其中的提示没有都出现在 \(U\setminus A\) 中 (否则 \(|A|\le|B|\)), 在这个环上未出现在 \(U\setminus A\) 中的提示中, 任意取一个加入 \(B\) 即可完成交换.
令 \(\mathcal M_2=(U,\mathcal I_2)\), \(S\in\mathcal I_2\) 当且仅当 \(U\setminus S\) 中从每个 NPC 获得的提示都不小于要求的 \(k_i\), 遗传性, 交换性显然.
拟阵交之. 一个很 sweet 的写法是每次都 \(\mathcal O(|U|)\) 判断独立性, 这样虽然是 \(\mathcal O(r^2|U|^2)\), 但舒服很多.
13.「Gym 102156D」Pick Your Own Nim
- Link & Submission.
- 「A.拟阵/拟阵交」(怎么会布置这玩意儿的专题呢?) (我草? 去年今日, 我写了拟阵交的学习笔记???)
设 Alice 给出的初始向量集合为 \(A\). 令 \(\mathcal M_1=(U,\mathcal I_1)\), 其中 \(U\) 即全体可选向量集合, \(S\in\mathcal I_1\) 当且仅当可重集 \(S\cup A\) 是线性无关组. 令 \(\mathcal M_2=(U,\mathcal I_2)\), \(S\in\mathcal I_2\) 当且仅当 Bob 的每个向量集合中最多一个入选 \(S\). 两个拟阵的遗传交换不言而喻. 交之.
有个小小的经验, 虽然拟阵交输入的两个拟阵的地位是等价的, 但可能对 \(\mathcal I_1,\mathcal I_2\) 的判断难度有所不同. 例如若对其中一个 \(\mathcal I\) 的判断需要维护不支持删除的数据结构, 我们可以把它放在 \(\mathcal I_1\), 这样增广的过程中只需要在固定 \(x\in V^L\) 时枚举 \(y\), 判断 \(I\setminus\{x\}\cup\{y\}\overset{?}{\in}\mathcal I_1\), "删除" (更多时候是直接重构) 就不在瓶颈处了.
14.「UR #11」「UOJ #168」元旦老人与丛林 ⭐
- Link & Submission.
- 「A.图论-网络流-最大流/最小割」「C.性质/结论」
嗯? 这是选拟阵题的时候乱入的吗? 还是有什么相关的分析呢?
一道猜猜题. 我们不难发现一个图是丛林的必要条件:
\(\forall V'\subseteq V\), 其诱导子图 \(G'=(V',E')\) 满足 \(|E'|\le2|V'|-2\).
可以证明, 这就是图是丛林的充要条件. 由于证明是重点, 这里就不放 <details>
框框了. 我们对 \(|V|\) 的大小归纳证明. 假设 \(|V|<n\) 时的所有图满足条件. 下考虑 \(|V|=n\) 的情况, 研究任意一个满足必要条件的图 \(G=(V,E)\).
取 \(G\) 中度数最小的结点 \(u\). 若 \(\deg(u)\ge4\), 则 \(|E|\ge2n>2n-2\), 不合假设. 因此必然有 \(\deg(u)\in\{0,1,2,3\}\). 设 \(G^\star=(V^\star,E^\star)\) 是 \(G\) 删去 \(u\) 及其连边后得到的图, 讨论 \(\deg(u)\):
对于 \(\deg(u)=0\), 直接取出 \(G^\star\) 中构造丛林的方案 (由归纳假设, 必然存在), 这显然也是 \(G\) 的构造方案; 对于 \(\deg(u)=1\), 将 \(u\) 的连边放入 \(G^\star\) 方案中的任意一个边集, 就能得到 \(G\) 的构造方案. 这是两种很简单的情况. 对于 \(\deg(u)=2\), 设有 \((u,x),(u,y)\in E\). 我们取出 \(G^\star\) 的构造方案, 将方案中的 \((u,x)\) 和 \((u,y)\) 放入不同的集合, 也就得到了 \(G\) 的构造方案.
下讨论 \(\deg(u)=3\) 的情况.
我们定义点集 \(V'\) 在某个图中的诱导子图 \(G'=(V',E')\) 是满子图, 当且仅当 \(|E'|=2|V'|-2\). 有引理:
若 \(V_1,V_2\) 的在一满足必要条件的图中的诱导子图均为满子图且 \(V_1\cap V_2\neq\varnothing\), 则 \(V_1\cup V_2\) 的诱导子图也是满子图.
设 \(V_3=V_1\cap V_2\), 对应诱导子图 \(G_3=(V_3,E_3)\), \(V_0=V_1\cup V_2\), 对应诱导子图 \(G_0=(V_0,E_0)\). 我们需要说明 \(G_0\) 是满子图. 因为 \(|E_0|\le2|V_0|-2\), 所以 \(|E_1|+|E_2|-|E_3|\le|E_0|\le 2(|V_1|+|V_2|-|V_3|)-2\), 又因为 \(|E_1|=2|V_1|-2\) 且 \(|E_2|=2|V_2|-2\), 所以 \(-|E_3|\le 2-2|V_3|\). 又因为 \(|E_3|\le 2|V_3|-2\), 所以 \(|E_3|=2|V_3|-2\). 最终有 \(|E_0|=2|V_0|-2\), 引理得证.
回到证明过程. 设有 \((u,a),(u,b),(u,c)\in E\), 可以发现, 必然存在 \(\{x,y\}\subseteq\{a,b,c\}\), 使得 \(G\) 中不存在包含 \(x,y\) 的满子图. 如果不存在这样的 \(x,y\), 则必然存在分别同时包含 \(\{a,b\},\{b,c\},\{c,a\}\) 的满子图, 根据引理, 它们并起来可以得到满子图 \(G'=(V',E')\). 此时令 \(V'\gets V'\cup\{u\}\), \(E'\gets E'\cup\{(u,a),(u,b),(u,c)\}\), \(G'\) 就不满足必要条件了.
现在, 我们可以取出这样的 \(\{x,y\}\). 令 \(E^\star\gets E^\star\{(x,y)\}\), 由于 \(x,y\) 的性质, 此时 \(G^\star\) 仍然满足条件, 取出它的构造方案. 最后, 将方案中的 \((x,y)\) 替换为 \((u,x),(u,y)\); 将 \(u\) 剩下的一条边加入另外一个集合, 就得到了 \(G\) 的方案.
$\square$综上, 我们只需要检查 \(G\) 是否存在 \(|E'|-2|V'|>-2\) 的子图, 依次钦定 \(V\) 中每个结点入选子图, 跑最大权闭合子图即可. 采取退流操作即可降低复杂度. 最终复杂度 \(\mathcal O(m\sqrt n+nm)\) (前半部分是第一次在二分图上跑网络流的复杂度).
15.「洛谷 P9347」似曾相识燕归来
- Link & Submission.
- 「A.构造」「C.细节」
某兔终于想起自己越来越长的 to-do list, 于是随机点了其中一道题. 妈的的确是依托答辩, 怪不得当时没做.
注意到 \(a_1=1\) 时, 操作 \((1,i,j)\) 等价于交换 \(a_i,a_j\), 因而我们构造的主要目标就是尽快令 \(a_1=1\). 未避免一些 corner, 这里只讨论 \(n>3\) 的情况.
- 若 \(a_1=1\), 已经结束了.
- 否则设 \(a_p=1\). 若能找到一个 \(p<i\) 使得 \(a_i<a_1\), 操作 \((1,p,i)\), 结束.
- 否则, 我们尽量向第二种情况靠拢. 若 \(a_1\ge3\), 则必然能找到 \(1<i<p\), 使得 \(a_p<a_1\), 操作 \((1,i,n)\) 即变成第二种情况.
- 现在 \(a_1=2\). 若 \(a_2=1\), 尝试找到一个 \(3\le i<n\), 使得 \(a_i>a_{i+1}\), 操作 \((1,2,i),(1,2,i),(1,i,i+1)\), 结束, 且 \(a_1=1,a_2=2\), 后续操作至多 \(n-3\) 步.
- 若找不到这样的 \(i\), 即 \(a_{3..n}\) 有序, 可以暴力手玩出构造: 操作 \((1,2,3),(1,2,3),(1,2,4),(1,3,4),(1,2,4)\). 注意 \(n=L=4\) 时会被莫名其妙认为无解.
- 最后一种情况, \(a_1=2,a_2\neq 1\). 设 \(a_q=n\), 若 \(q=2\), 操作 \((1,2,p),(1,p,n)\), 否则操作 \((1,2,q),(1,2,p),(1,p,n)\).
\(\mathcal O(n)\). 还是欣赏一下这篇 sol set 里另外两道构造神题吧家人们.
标签:Set,frac,放逐,sum,Solution,构造,mathcal,binom,我们 From: https://www.cnblogs.com/rainybunny/p/17464486.html