\[\mathbb{Defining~\LaTeX~macros\dots}
\newcommand{\chr}[1]{\underline{\texttt{#1}}}
\newcommand{\lca}[0]{\operatorname{lca}}
\newcommand{\gap}[0]{\operatorname{gap}}
\newcommand{\anc}[0]{\operatorname{anc}}
\newcommand{\vct}[1]{\boldsymbol{#1}}
\]

  这篇 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.」海盗

  不难发现, 我们可以通过描述 \(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」密码锁

  竞赛图的缩点后一定是满足每个点都向后面所有点连边的链, 这都不知道的吗…

  因此, 我们只需要计数非空割集的数量. 若不考虑特殊的边, 割 \((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」设计草图

  不难发现, 某个子串 \(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.」统一省选

  注意到所有的单个关卡都可以表示成进入血量 \(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.」并行计算 ✡️

  这题很麻烦的点在于需要构造步数严格最小的方案, 我们必须得找到一个紧的下界, 才有构造的目标.

  比较简单的一个界是 \(\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.」游戏

  第一问没手也行: 独立地考虑每个位置被选入方案的概率. 假设我们在所有合法方案中随机挑一个出来, 记事件 \(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.」模拟赛

  水题放 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 ✡️

  希望出题人不要在题解中写谜语.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)\) 的性质. 以下结论都是不言而喻的:

  1. 若 \(v\) 是 \(u\) 的树上祖先, 则 \(\gap(u,v)=0\).

  2. 设 \(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」似曾相识燕归来

  某兔终于想起自己越来越长的 to-do list, 于是随机点了其中一道题. 妈的的确是依托答辩, 怪不得当时没做.

  注意到 \(a_1=1\) 时, 操作 \((1,i,j)\) 等价于交换 \(a_i,a_j\), 因而我们构造的主要目标就是尽快令 \(a_1=1\). 未避免一些 corner, 这里只讨论 \(n>3\) 的情况.

  1. 若 \(a_1=1\), 已经结束了.
  2. 否则设 \(a_p=1\). 若能找到一个 \(p<i\) 使得 \(a_i<a_1\), 操作 \((1,p,i)\), 结束.
  3. 否则, 我们尽量向第二种情况靠拢. 若 \(a_1\ge3\), 则必然能找到 \(1<i<p\), 使得 \(a_p<a_1\), 操作 \((1,i,n)\) 即变成第二种情况.
  4. 现在 \(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\) 步.
  5. 若找不到这样的 \(i\), 即 \(a_{3..n}\) 有序, 可以暴力手玩出构造: 操作 \((1,2,3),(1,2,3),(1,2,4),(1,3,4),(1,2,4)\). 注意 \(n=L=4\) 时会被莫名其妙认为无解.
  6. 最后一种情况, \(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 里另外两道构造神题吧家人们.

Solution Set - “潮汐守候终结放逐月圆”的更多相关文章

  1. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

  2. BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  3. Note -「圆方树」学习笔记

    目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...

  4. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  5. 词根:lun = moon, 表示“月亮”

    词根:lun = moon, 表示“月亮” lunar [lun月亮,-ar形容词后缀,…的] 月亮的,太阴的,似月的,新月形的 semilunar [semi-半,lun月亮,-ar形容词后缀,…的 ...

  6. [No000001]一切都是最好的安排

    <一切都是最好的安排> 从前有一个国家,地不大,人不多,但是人民过着悠闲快乐的生活,因为他们有一位不喜欢做事的国王和一位不喜欢做官的宰相. 国王没有什么不良嗜好,除了打猎以外,最喜欢与宰相 ...

  7. atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

    atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 ...

  8. 精通CSS+DIV基础总结(一)

    这段时间学习了玩了DIV+CSS的视频,感觉效率不高.前边的Javascript总结的不好,但是看了后边的JQuery,觉得学习的再多一点,再进行Javascript的总结.DIV+CSS总结,估计会 ...

  9. 月亮之眼_KEY

    [问题描述] 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散落民间几百年的珍宝--月亮之眼.吉儿深知"月亮之眼"价值连城:它是由许多珍珠相连 ...

  10. 什么是设计思维Design Thinking——风靡全球的创造力培养方法

    “把学习带到现实中,让孩子用自己的力量创造改变,可以直接提升他们的幸福感和竞争力.” 这是“全球孩童创意行动”的发起人——Kiran Sethi在TED演讲时说的一句话,这个行动旨在引导中小学生主动寻 ...

随机推荐

  1. 本文是第一篇在GitHub仓库中撰写的.md格式的blog文件

    正文内容: 具体内容,只是未来测试,给出福利: 模板格式: title: 博文标题 description: 博文摘要 #多个标签请使用英文逗号分隔或使用数组语法 tags: 标签1, 标签2 #多个 ...

  2. Python中序列化/反序列化JSON格式的数据

    基本概念 JSON: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于 ...

  3. docker连不上私有仓库Harbor

    解决办法: # 配置多个host(配置本地域名映射) [root@vm10-11-0-38 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.local ...

  4. 小米R3G刷了padavan后时间不同步和定时关闭外网(wan)端口

    怎么刷openwrt或者padavan请见我2022年3月份的帖子 https://www.cnblogs.com/jar/p/15954037.html 最近遇到个新环境,遂拿出来用用 有1个问题和 ...

  5. 大模型推理指南:使用 vLLM 实现高效推理

    本文主要分享如何使用 vLLM 实现大模型推理服务. 1. 概述 大模型推理有多种方式比如 最基础的 HuggingFace Transformers TGI vLLM Triton + Tensor ...

  6. 『玩转Streamlit』--布局与容器组件

    在Streamlit中,布局类组件扮演着至关重要的角色. 它们不仅决定了应用程序的视觉呈现和用户体验,也极大地增强了页面内容的组织性和可读性. 通过这些组件,开发者可以灵活地划分页面空间,创建出清晰. ...

  7. after_request 可以直接用于接口日志

  8. phpstorm之代码质量工具

    在进行php开发的时候, 经常由于编码上的不规范导致了隐藏的bug,这里介绍代码质量工具 PHP CodeSniffer:    phpcs [安装] composer require squizla ...

  9. Python之argparse

    argparse模块可以轻松编写用户友好的命令行界面.该程序定义了它需要的参数,argparse并将找出如何解析这些参数sys.argv.argparse模块还会自动生成帮助和用法消息,并在用户给出程 ...

  10. python之pyecharts

    文档:https://pyecharts.org/ 安装: pip install pyecharts 示例: from pyecharts.charts import Bar from pyecha ...