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

浙公网安备 33010602011771号