20250124模拟赛

20250124模拟赛

字符串覆盖问题

原题

枚举每一个长度前缀判断是否可行。显然对于一个长度 \(len\) 有做法是,当前已经覆盖了一个前缀,每次找到最后一个可以拓展的位置拓展。

考虑每次向后拓展的长度,如果连续两次长度都小于 \(\frac {len} 2\),则可以直接拓展第二次且也是可行的。所以如果每次拓展最后一个位置的话,对于长度 \(len\) 只需要拓展 \(O(\frac n {len})\) 次。总共只有 \(O(n\ln n)\) 次拓展。

现在问题是如何找到最后一个可以拓展的位置。预处理 \(x_i\) 表示 \(i\) 开始的后缀与原串的 LCP,\(y_i\) 表示 \(i\) 开始的前缀与反串的 LCS。这两个都可以 exkmp。

对于一个长度 \(i\),当前覆盖了前缀 \([1,k)\),覆盖方式有两种:

  • 用正串,找到 \(\leq k\) 的第一个 \(x_j\geq i\) 的位置 \(j\),覆盖到 \(j+i\)
  • 用反串,找到 \(\leq k+i-1\) 的第一个 \(y_j\geq i\) 的位置 \(j\),覆盖到 \(j+1\)

\(i\) 扫描线,并查集维护前驱。

计算几何问题

考虑对于所有 \((i,j)\),将 \(i\to j\) 的向量极角排序,这样依次选出一些向量如果相邻两个都首尾相接就是一个凸包。

枚举起点,按上述顺序遍历向量,设 \(f_x\) 表示已经选择的向量末尾到了 \(x\) 点的最大值,每次加入一个三角形。

计算任意三角形内的点权和可以预先处理所有 \((i,j)\) 与原点形成三角形的有向面积容斥计算。

路径覆盖问题

容易有 dp,设 \(f_{x,d}\) 表示 \(x\) 子树内点到 \(x\) 路径上被选择边最多的路径选了 \(d\) 条的最大价值,转移是 \(f_{x,d}+f_{v,p}\to f_{z,max(d,p)}(d+p\leq K)\)

根深度有关的 dp 可以长剖优化。对于两个长度为 \(A,B(A>B)\) 的 dp 数组,我们要在 \(O(B)\) 的复杂度内把它合并到 \(A\) 上。观察合并条件的限制,发现最前端 \(B\)\(\max\) 卷积,中间一段转移是 \(f_{x,d}+\max_p f_{v,p}\to f_{z,d}\),最后一段是 \(f_{x,d}+\max_{p\leq K-d} f_{v,p}\to f_{z,d}\)

第一段第三段合并都是容易 \(O(B)\) 的,所以现在问题是第二段合并还有继承信息时怎么快速加入一条边。发现 \(f_{x,d}\) 对于固定的 \(x\) 关于 \(d\) 是上凸的,所以用 set 维护差分,加入一条边 \(w\) 就是向 set 中加入 \(w\),如果元素个数大于 \(K\) 就删除最小的,而第二段转移由于维护了差分就直接不用操作,这样就做完了。

posted @ 2026-01-28 16:18  programmingysx  阅读(2)  评论(0)    收藏  举报
Title