做题记录 26.3.26

\(\textcolor{purple}\odot\) CF356E Xenia and String Problem

枚举回文中心,显然每个中心至多有 \(O(\log n)\) 种区间

检查一个区间是否合法容易做到 \(O(n\log n)\)(判断当前区间是否回文,判断当前中心字符是否只出现一次,递归判断左半部分)

枚举每种可能的中心,若目前区间回文,则要么修改中心字符,要么当前区间已经合法并更新对当前区间外的修改的贡献

若目前区间不回文,且左右两边有恰好一个字符不同,则两种可能的情况分别检测一下

其它情况必然无贡献

容易做到 \(O(n\log^2n+n|\sum|\log n)\),可以用 \(\text{SA}\) 做到确定性

代码

\(\textcolor{purple}\odot\) AT_arc151_e [ARC151E] Keep Being Substring

显然操作可逆,因此假定对两个串都可操作

显然若两者存在非空公共子串,则两者都删到最长公共子串一定最优,否则最优解一定是两者都删到只剩一个字符,然后两个字符根据 \(a\) 中相邻情况尝试走到一起

前者可以用 \(\text{SA}\)、哈希或 \(\text{SAM}\) 等求出 \(\text{LCS}\) 做到 \(O(n\log n)\)\(O(n)\)

后者做多源最短路即可,显然边权为 \(1\),时间复杂度 \(O(n)\)

总时间复杂度 \(O(n\log n)\)\(O(n)\)

代码

\(\textcolor{black}\odot\) CF786D Rap God

容易做到 \(O(nq)\),主要问题在于常数

一些优化:

  1. 通过一些预处理使得单次询问复杂度和路径长度相关
  2. \(\text{dfs}\) 换为 \(\text{bfs}\),且将 \(\text{bfs}\) 过程中需要用到的信息和队列记在一起,避免随机读取
  3. 将所有点按 \(\text{dfn}\) 重标号,当树有大量二度点时可以使得访问连续,而二度点较少时路径长度的 \(O(n)\) 常数较小
  4. vector 改为若干数组,一个结点的邻域为其中一个区间,集中存储以减少 \(\text{cache miss}\)
  5. 尽量减少动态内存分配

代码

\(\textcolor{black}\odot\) CF1097H Mateusz and an Infinite Sequence

倍增,令 \(I_{i,j}\) 表示长度为 \(d^i\) 的前缀整体加 \(j\) 后的信息,每个信息保存区间长度,区间内答案,区间前后缀的匹配情况,容易做到 \(O(nmd\log_d r)\)

bitset 容易优化到 \(O(\frac{nmd\log_dr}\omega)\)

代码

参考

\(\textcolor{black}\odot\) P8497 [NOI2022] 移除石子

先考虑 \(k=0\) 时如何判断一组 \(a_{1\sim n}\) 是否合法

显然操作可以简化为:单点减 \(2\)\(3\),长为 \(3\sim 5\) 的区间减 \(1\)

显然不存在两个完全相同的的区间减,否则可以用若干单点减 \(2\) 代替

若存在同一右端点的长度为 \(4\)\(5\) 的区间减,则可以替换为长度为 \(3\)\(4\) 的区间减与单点减 \(2\)

从而以每个点为右端点的区间减至多有两个

\(f_{i,j,k}\) 表示 \(1\sim i\) 中有 \(j\) 个区间减必须延伸到 \(i\)\(k\) 个延伸到 \(i+1\),是否可行,则边界为 \(f_{0,0,0}=1\),答案为 \(f_{n+1,0,0}\),转移为

\[f_{i,p,l}\gets C(a_i-j-k-l)f_{i-1,j,k} \;\;(k\le p\le j+k) \]

其中 \(C(i)=[i\ge 0\land i\ne 1]\)

显然 \(j,k,l\) 范围都是 \(0\sim 2\)

然后考虑 \(k\) 的影响

可以发现 \(k=1\) 时,若 \(a_i=0\)\(a=\{1,1,1\}\) 则无解,其它情况下若 \(k-1\) 有解则 \(k\) 有解

因此令 \(g_{i,j,k}\) 表示 \(f_{i,j,k}\) 成立时 \(a_{1\sim i}\) 所需的最小总操作次数,容易做到 \(O(n)\)

对于原问题,考虑 \(\text{dp of dp}\)

\(g_{\ast,j,k}\) 的九个数压缩为一个状态,\(f_{i,s}\) 表示 \(1\sim i\) 到达状态 \(s\) 的方案数

理论上状态有 \(102^9\),但实际从 \({0,101,101,101,101,101,101,101}\) 可达的有不到 \(10^4\) 种,可以接受

时间复杂度 \(O(nSV)\)

注意到实际上当 \(a_i>6\) 时可以认为是 \(6\),从而 \(O(V)\) 可以做到 \(O(1)\)

时间复杂度 \(O(S\log S+\sum nS)\),常数极大

代码

参考

posted @ 2026-03-27 07:17  Hstry  阅读(1)  评论(0)    收藏  举报