Live2D

Solution Set - “如果惊蛰随梦远走”

\[\text{ᘏ ᘏ}\\ \quad\,\,\text{( ˃̵ ֊ ˂̵ )}\\ \text{つ🥕ど}\quad \newcommand{\str}[1]{\underline{\texttt{#1}}} \newcommand{\addeq}[0]{\overset{+}{\gets}} \newcommand{\op}[1]{\operatorname{#1}} \newcommand{\lca}[0]{\op{lca}} \]

  *冷知识: Wfurent 有类似胡萝卜的植物, 但兔子们表示并不好吃.

0.「UR #15」「UOJ #226」奥林匹克环城马拉松 ⭐

BEST 定理.

  在有向图 \(G\) 中, 以 \(\deg(u)\) 表示点 \(u\) 的出度 (等于入度), \(T_r(G)\) 表示以 \(r\) 为根的外向 (或内向) 树形图数目, 则 \(G\) 的 Euler 回路数目为

\[T_r(G)\prod_{u\in V}(\deg(u)-1)!. \]

  大概就是先对给定的基环树定向, 然后数外向生成树. 因为树上定向方案是唯一的, 所以枚举环上任意一条边沿某个方向走的次数就能给全部边确定方向 (记得带上组合数选出重边子集). 数外向树的话, 只需要枚举环上哪条边被断掉, 树上贡献不变, 环上贡献的变化量 \(\mathcal O(1)\), 也可以算出来. 最终复杂度 \(\mathcal O(nt)\).

1.「UR #22」「UOJ #682」月球铁轨 ⭐

  令 \(b_i\gets a_i\oplus b_i\), \(a_i\gets\bigoplus_{j=1}^ia_i\), 则区间 \([l,r]\) 的最优值为 \(a_r\oplus a_{l-1}\) 放入 \(\{b_l,\cdots,b_r\}\) 中异或得到的最大值. 令 \(B_{l,r}\) 表示 \(\{b_l,\dots,b_r\}\) 的张成空间, \(f(x,V)\) 表示 \(x\) 在空间 \(V\) 中异或出的最小值, \(g(x,V)\) 表示最大值. 则 \([l,r]\) 的贡献可以表示为 \(g(a_r\oplus a_{l-1},B_{l,r})\), 我们大概会二分答案 \(k\), 所以要完成的是形如 \(g(a_r\oplus a_{l-1},B_{l,r})\overset{?}{\le}k\) 的判断.

  自由度太高了, 尝试把 \(a_r\oplus a_{l-1}\) 拆开再放入线性基. 注意到 \(g(x\oplus y,V)=f(x,V)\oplus g(y,V)\) (按位考虑, 可以看出左侧选出的基向量在右侧一定被选奇数次, 未选出的向量一定被选出偶数次). 据此, 我们大致的思路就是把 \(f(a_{l-1},B_{l,r})\) 建出 Trie 树, 然后用 \(g(a_r,B_{l,r})\) 上去查询答案. 虽然 \(B_{l,r}\) 仍然和两个端点相关, 但是固定一个端点时, 只有 \(\log V\) 种不同的 \(B\), 我们可以根据空间秩来区分它们, 对不同的秩分别建 Trie 树求解即可.

  受限于空间, 没有办法保留整个 Trie, 我们考虑逐位确定答案, 这样 Trie 就只需要保留一层结点的相对位置关系. 右端点 \(r\) 到左端点 \(l\) 的贡献区间是单调移动的, 所以可以线性扫描贡献答案. 最终时间复杂度 \(\mathcal O(nm^2)\), 空间 \(\mathcal O(nm)\).

2.「NOI Simu.」箭头

  我们可以把箭头在一开始就转一转拆成四个方向的具有使用代价的箭头, 此后就不需要考虑箭头的转向. 一个箭头可以更新一行或者一列上所有位置 (细致来说, 所有箭头起点) 的最短路. 这是坏事: 不能直接建图. 这也是好事: 结合所有 \(f\) 相同, 我们可以只更新里箭头的初始终点最近的两个箭头起点, 并标记它们可以以 \(f\) 的代价在行或列上任意行走. 这样实际松弛次数是 \(\mathcal O(n)\) 的, 最终复杂度 \(\mathcal O(n\log n)\).

  时隔不知道多久, 终于存在有签到题的模拟赛了. 深中! 你是兔的天使!

3.「CF 830E」Perpetual Motion Machine ⭐

  思路非常自然的题, 算得上是 educational? 深中! 你是兔的天使!

  Observation A: 若存在一个结点 \(\deg\ge 4\), 令该点 \(a=2\), 其邻接点 \(a=1\), 合法.

  Observation B: 若存在环, 令环上所有点 \(a=1\), 合法.

  现在只需要考虑二叉树.

  Observation C: 若存在两个连通的 \(\deg=3\) 的点, 令两点路径上 \(a=2\), 两点各自不在路径上的邻接点 \(a=1\), 合法.

  现在只需要考虑存在至多一个 \(\deg=3\) 的点的树. 不妨以 \(\deg(r)=3\)\(r\) 为根, \(L_1,L_2,L_3\) 分别表示三条连上的结点编号. \(|L_1|\le|L_2|\le|L_3|\).

  Observation D: \(|L_1|\ge2\) 时, \(a_r=3\), 三条链分别构造 \([2,1],[2,1],[2,1]\), 合法.

  现在只需要考虑 \(|L_1|=1\). 这下不太好 observe 了, 写个暴搜再说.

  Case E: \(|L_2|\ge3\) 时, \(a_r=3\), 三条链分别构造 \([2],[3,2,1],[3,2,1]\), 合法 (硬搜结论).

  现在只需要考虑 \(|L_1|=1,|L_2|\le2\) 的情况.

  Case F: \(|L_3|\ge 5\) 时, \(a_r=6\), 三条链分别构造 \([3],[4,2],[5,4,3,2,1]\), 合法 (硬搜结论).

  ABCDEF 六种情况拍上去就过了, \(\mathcal O(n)\) 或者 \(\mathcal O(n\alpha(n))\). 我们理应证明其他情况无解, 但兔的数学只有高中学考水平, 再见!

4.「CF 1474F」1 2 3 4 … ⭐

  任意 LIS 都是连续上升的整数列. 设 \(s\)\(a\) 的前缀和, LIS 的长度 \(\ell\) 显然是 \(\max_{l<r}\{s_r-s_l\}\). 注意到这里能取到最大值的 \((l,r)\) 在按 \(r\) 升序排列后, 一定满足 \(s_r\) 不增, 因此我们可以对每段极长的 \(s_r-s_l=\ell\) 求答案.

  LIS 很长, 段数很少, 可以主动地向矩阵快速幂靠. 令 \(f(i,j)\) 表示上升序列长度为 \(i\) 时, 最后一个数取自第 \(j\) 段的方案数. 在两个值域上相邻的转折点之间, \(f(i,\cdot)\)\(f(i+1,\cdot)\) 的转移是确定的线性变换, 矩阵快速幂即可. 复杂度 \(\mathcal O(n^4\log n)\).

5.「CF 1842H」Tenzing and Random Real Numbers

  你这 H 这么… 清新的?

  令所有 \(x_i\gets x_i-0.5\), 这样 \(x_i+x_j\) 的正负性由绝对值较大者的符号决定. 按绝对值升序状压 DP 即可, 用一些位运算做转移合法性判断可以做到 \(\mathcal O(n2^n)\).

6.「UR #17」「UOJ #370」滑稽树上滑稽果

  妈的, 读错题了, 请出题人吃橘子.

  显然最优构造是整出一条链. 不考虑所有数字都有的 bit, 设 \(f(S)\) 表示使得链底的滑稽度为 \(S\) 时的最小代价, 枚举子集转移即可. \(\mathcal O(V^{\log_23})\).

7.「SDOI 2019」「洛谷 P5362」连续子序列

  \(T\) 串具有非常好的归纳性质, 我们也可以尝试询问 \((S,k)\) 通过某种规则不断折半范围, 直到可以直接回答为止. 考虑一种 "任意位置上的子串都会被折半" 的构造过程:

  • \(T_0=\str{0}\).
  • \(T_{i,j}\gets T_{i-1,j}\), \(T_{i,j+0.5}=\lnot T_{i,j}\), 得到 \(T_i\).

  将 \(S\) 按两种可能的对齐方式折半就行. 记忆化后状态数是 \(\mathcal O(|S|+\log k)\) 的.

8.「CTS 2019」「洛谷 P5404」重复 ⭐

  "存在" 不如 "任意", 我们来计数所有非法串 \(T\). 一个很棒的 motivation 是, 我们不从 \(T^{+\infty}\) 的左端点开始尝试和 \(S\) 匹配, 而是从 \(T^{A}TT^{+\infty}\) (\(A\) 为一充分大的常数) 中的 \(T\)\(S\) 的匹配情况来比较大小关系. 假设 \(T_A\)\(S\) 的 AC 自动机上匹配到结点 \(u\), 则 \(T\) 为非法串的要求就是: 从 \(u\) 开始的一系列匹配过程中没有到达可以产生 \(<S\) 的后缀, 且匹配完成后回到结点 \(u\).

  这样, \(70\) 分很轻松: 我们预处理匹配到 \(S[:\ell]\) 时能否用字符 \(c\) 转移, 若能, 转移到哪个位置, 枚举 \(u_0\), \(\mathcal O(nm|\Sigma|)\) DP 一遍, 统计回到 \(u_0\) 的 DP 结果, 就能求出答案. 复杂度 \(\mathcal O(n^2m|\Sigma|)\).

  可以看出, DP 过程是一个与 \(u_0\) 无关的线性变换, 但仅仅 "是一个线性变换" 已经没有办法提供优化了, 我们需要考察匹配的具体性质. 若从 \(u\) 通过字符 \(c\) 的转移没有回到 \(0\), 则所有 \(<c\) 的字符转移都必然产生 \(<S\) 的后缀. 因此, 这样的 \(c\) 至多只有一个. 仍然枚举 \(u_0\), 我们直接模拟这段没有回到 \(0\) 的转移, 计算从当前状态回到 \(0\) 然后走到 \(u_0\) 的答案 (只与剩余步数和 \(u_0\) 有关, 可以预处理). 如果可以通过 \(c\) 转移完整个 \(T\) 会到 \(u_0\), 再把答案\({}+1\) 就行. 最终复杂度 \(\mathcal O(nm|\Sigma|)\).

9.「CF 1842G」Tenzing and Random Operations ⭐

  AGC 风味好题.

  有点类似 "DP and DP", 虽然 \(\prod(a_i+v+v+\cdots)\) 中的 \(v\) 很多, 但实际上被 \(\prod\) 选入贡献的只有 \(\mathcal O(n)\) 个, 我们只需要区分它们. 令 \(f(i,j)\) 表示考虑了 \(t=1\sim i\) 的贡献, 已经有 \(j\) 个不同操作带来的 \(v\) 产生过贡献, 转移:

  • \(i+1\) 处由 \(a_{i+1}\) 贡献, \(f(i+1,j)\addeq f(i,j)\).
  • \(i+1\) 处由已有的 \(v\) 再次贡献, 只需要选出这个 \(v\), \(f(i+1,j)\addeq jv\times f(i,j)\).
  • \(i+1\) 处由新的 \(v\) 第一次贡献, 需要选处某次操作和操作到的位置, \(f(i+1,j)\addeq i(m-j)\times v\times f(i,j)\).

答案显然就是 \(\sum f(n,j)n^{-j}\) (当然在一些题里这里还需要写另一个 DP, 所以叫 DP and DP). 复杂度 \(\mathcal O(n^2)\).

  Fun fact: 这 round 的主人公中文名叫做丁真.

10.「SDOI 2018」「洛谷 P4605」物理实验

  先转一转把导轨转到水平方向. 不妨只考虑导轨上访的挡板, 扫描 \(x\), 维护经过该横坐标的挡板关于经过位置的纵坐标值排序的结果, 每次被照射到的挡板就是 \(y\) 最小的一个. 将区间加法贡献离线下来, 最后再扫描线一次求出区间和的最大值即可. \(\mathcal O(Tn\log n)\), 常数略大.

11.「NOI Simu.」流星雨

  对于某个时刻下的询问 \(k\), 可经过的格子 \((r,c)\) 满足限制 \(r\in R_k\lor c\in C_k\), \(R_k,C_k\) 即行列编号集合. 线段树二分求一求从起点或者终点出发最近能够到达的 \(r\in R_k\) 或者 \(c\in C_k\) 就行. 注意有一种特殊情况是起点终点间所有的行 (或列) 都可用, 这样可以直接走最短距离, 不需要关心列 (或行) 的状态.

  \(\mathcal O(m\log n)\), 卡常真没品.

12.「LOJ #6289」花朵 ⭐

  我真没做过?

  树上问题, 不弱于菊花 (分治 FFT), 不弱于链 (分治 FFT), 所以一句话概括做法就是把菊花和链拼起来就行.

  具体来说, 重剖, 用类似 DDP 的顺序计算多项式. 链顶到父亲的贡献分治 FFT 乘起来, 重链上再整个分治 FFT 算重链顶的答案. \(\mathcal O(n\log^2n)\). 也许可以用全局平衡的链剖分方式去掉一个 \(\log\).

13.「LOJ #6680」henry_y 的函数

  \(\mathcal O(n)\) 筛个 \(g(\cdot)\) 应该是基本功吧, 然后我们就飞快地得到了一个 \(\mathcal O(n\log n)\) 的做法, 实际上已经能过了.

  但某校的 CPU 跑不过 LOJ 时限还比 LOJ 小啊! 我们还是整点更快的吧.

  设 \(h(n)=f(n)-f(n-1)\), 则

\[\begin{aligned} h(n) &= \sum_{i=1}^{n}((n/i)^2-((n-1)/i)^2)g(i)\\ &= \sum_{d\mid n}((n/d)^2-(n/d-1)^2)g(d)\\ &= \sum_{d\mid n}(2d-1)g(n/d)\\ &= 2(\text{id}\star g)(n)-(I\star g)(n). \end{aligned} \]

多筛点儿东西就 \(\mathcal O(n)\) 了.

14.「洛谷 P7390」造树 ⭐

  大概感受到大家初见树上道路铺设的感觉了: 题解说得对, 看之前不会!

  根据排序不等式, 我们希望小点权尽量和小点权连边, 大点权尽量和大点权连边. 可以通过 exchange argument 证明在保持合法的前提下, 贪心选择最小的匹配对最优.

  不妨把所有点按照点权升序排列. 我们从左到右扫描结点, 尝试为它们找到以 \(1\) 为根时的父亲, 我们需要一直保持 \(1\) 所在连通块能够产生出边, 这样才能让树连通. 维护连通块 \([1,j]\), 枚举连通块中有出边的结点 \(i\), 单调移动指针. \(i\) 不能和 \(j+1\) 直接相连而二者都没有出度, 这个时候需要找到最近的有 \(>1\) 的出度的点 \(k\), 让 \(1\) 连续段尽量向 \(k\) 连. 三个指针扫描即可, 瓶颈是排序的 \(\mathcal O(n\log n)\).

15.「CF 1098F」Ж-function ⭐

  • Link & Submission.
  • 「A.字符串-SAM」「A.树论-点分治/点分树」

  LCP 不是好文明, LCS 可以用 SAM 的 parent 树描述! 建出 \(S\) 的后缀树 (反串 parent 树), 不妨认为对于 \(i\in[1,n]\), 树上结点 \(i\) 恰好对应 \(S[i:]\). 此时 \([l,r]\) 的答案可以写为:

\[\textit{ans}_{l,r}=\sum_{i\in[l,r]}\min\{\textit{mx}_{\lca(l,i)},r-i+1\}. \]

相比于 \(\lca(l,i)\), \(\textit{mx}_{\lca(l,i)}\) 反而有更好的性质: 它就是 \(l\to i\) 树上路径中的最小权值, 我们借此转化掉 LCA, 把问题转化为无根树上的路径贡献. 点分治嘛, 设分治中心 \(u\), 讨论 \(l\)\(i\) 的关系 (注意和 \(l\) 相关的量是可枚举的):

  • 最小权 \(x\)\(l\to u\) 取到:
    • 对于 \(l\le i\le r-x+1\), \(i\)\(\textit{ans}_{l,r}\) 贡献 \(x\).
    • 对于 \(r-x+1<i\le r\), \(i\)\(\textit{ans}_{l,r}\) 贡献 \(r-i+1\).
  • 最小权 \(x\)\((i\to u)\setminus\{u\}\) 取到:
    • 对于 \(i\in[l,r]\)\(x+i-1\le r\), \(i\)\(\textit{ans}_{l,r}\) 贡献 \(x\).
    • 对于 \(i\in[l,r]\)\(x+i-1>r\), \(i\)\(\textit{ans}_{l,r}\) 贡献 \(r-i+1\).

  第一部分可以直接在 \((\text{id},\text{min})\) 的二元组序列上二分. 第二部分是二维偏序, 离线掉 \(i\in[l,r]\), 另一个偏序挂 BIT 即可维护. 复杂度 \(\mathcal O(n\log^2 n)\) (\(n,q\) 同阶).




  刚好选到这首歌, 又看到 APJifengc 的闲话啊, 就当作把这首歌送给他叭.

颤抖 仍坚定眼眸
究竟 为何而守候
直到帷幕落下 才明白理由
haru haru haru haru
原来温暖触手可得
即使倒灌的寒冷终将我淹没
不曾散去云层背后
如果惊蛰随梦远走
就让愿望一并汇入河流
向春雨飘融白雪的尽头
posted @ 2023-06-29 22:43  Rainybunny  阅读(246)  评论(2编辑  收藏  举报