Last Dance?
11.2
P14362 [CSP-S 2025] 道路修复 / road
什么你问我为什么这道题不放在 11.1 因为我特么没场切啊。
显然 \(m\) 诈骗吧,只保留最小生成树就行,枚举每个特殊点状态然后 Kruskal 可以做到 \(O(2^knk\log(nk))\),然后赛时就止步于此了,然而只需要把所有边预先排个序就可以把那个 \(\log\) 去掉。
如果你牺牲一点空间存每个状态的所有边然后每次从上一个状态 \(O(n)\) 归并一下可以做到 \(O(2^kn)\)。
P14363 [CSP-S 2025] 谐音替换 / replace
什么你问我为什么这道题不放在 11.1 因为我特么没场切啊。
多模匹配一眼 AC 自动机吧,匹配条件一眼要求 \(S_1S_2\) 前后缀相同部分与中间的不同部分分别同 \(T_1T_2\) 相应部分相同吧。怎么会有奶龙想出直接合并两个串达到 \(26^2\) 的字符集然后硬上 AC 自动机然后直接爆零呢。
考虑把每个字符串对用如下方式存入自动机:\(\texttt{A#BC#D}\),\(\texttt{AD}\) 是前后缀相同部分,\(\texttt{#}\) 是特殊字符,\(\texttt{BC}\) 表示两串不同部分连在一起,然后直接跑多模匹配就行了啊。空间完全够的。
11.3
AT_arc068_d [ARC068F] Solitaire
简单转化一下就是要求可以划分成两个不降序列并给定 \(1\) 的位置的方案数。
显然 \(k\) 之后的部分是可以额外计算的。考虑 \(k\) 之前的部分,由于要去重,因此需要钦定构造方式尽可能倾向一个序列。不难发现直接计数要枚举的有点多所以设计 DP 解决,事实上利用性质正确钦定构造方式之后状态和转移方程都很简单。
CF1149C Tree Generator™
首先这个东西显然得想办法放到序列上解决。一个关键且简单然而我没想到的东西是 \(dis(x,y)=dp(x)+dp(y)-2dp(lca(x,y))\)。然后 \(dp(x)\) 是容易得到的,令左括号 \(+1\) 右括号 \(-1\),那么 \(dp(x)\) 就是 \(x\) 位置的前缀和。通过 \(O(1)\) LCA 方法可以联想到 \(dp(lca(x,y))\) 就是区间最小值。
放线段树上维护这个东西即可。但是区间最小值貌似不很好维护。这时候我们发现如果最小值偏大必然更劣,因此只需要分别维护两边到边界的最小值两种方案取最大值即可。又是这种不合法不优的典 trick。
P4425 [HNOI/AHOI2018] 转盘
首先你发现显然只会在起点停留不劣。然后你发现只会走一圈,不然你按住结束点不懂然后把起始点移动直到没有重合部分并延后出发时间,你发现显然是等价的。
因此我们就是要求最小的出发时间。列出来就是 \(\min\limits_{i=1}^{n}\max\limits_{j=i}^{i+n-1}(T_j+i-j)+n-1\)。然后又是那个典爆了的不合法不优。你发现如果越出 \(i+n-1\) 的话会与之前重合,然后 \(T_{i+n}-(i+n)<T_i-i\),因此直接变成 \(\min\limits_{i=1}^{n}(\max\limits_{j=i}^{2n}(T_j-j)+i)+n-1\)。
这个东西放线段树上维护即可。不带修是简单的。考虑修改,单侧递归即可,回溯时搜左子树更新,也就是二分最后一个被更新点影响的位置。