11

https://www.luogu.com.cn/problem/AT_nikkei2019_2_final_h

第一次见到能 manacher 但不能二分+哈希的题!

直接上 manacher,当尝试将区间拓展为 \([l,r]\) 时,考察 \(nxt_l\)\(lst_r\) 的位置关系,可以 check \([l,r]\) 是否合法。

\(p_i\) 继承 \(p_{2x-i}\) 的值时,可能需要缩小区间,这个可以暴力缩,可以证明复杂度是对的。

https://zhengruioi.com/problem/3395

首先可以把题目转化为如下形式:有一个点数为 \(\Sigma\) 的竞赛图,选择每条边有一个代价。你需要选出一个内向基环森林,如果选出了一个纯环需要额外的 \(k\) 代价,最小化总代价。

考虑先令每个点都选择代价最小的一条出边,得到一个图。在计算一个新图的代价时,我们可以认为,除了原图上存在的环之外,其它的纯环不带 \(k\) 的代价。这是因为,即使不带 \(k\) 的代价,这个环也不优。

于是可以直接状压了:从 \(1\)\(n\) 考虑每个点的出边,在这个过程中状压原图中的每个环有没有被破坏。环的数量最多 \(\frac{n}{2}\) 个,所以复杂度 \(O(2^{\frac{n}{2}}*n^2)\)

https://zhengruioi.com/problem/3387

考虑猫树分治,答案形如 \(\min\operatorname{abs}(\min(la_i,ra_{i+k})-min(lb_i,rb_{i+k})))\)。这个东西可以直接分讨大小关系做。

https://www.luogu.com.cn/problem/P11983

这题太困难了。

从大到小枚举值域。设有 \(k\)\(a_i=v\)。然后依次尝试加入区间,如果加入区间后最小点覆盖数量 \(\le k\) 就加入。这样可以得到一个多项式做法。

观察一下,我们加入的区间会是什么形态。肯定是一段极长前缀 + 若干散点。这段前缀的最小点覆盖数量需要 \(=k\),否则可以再加一个区间使得前缀更长。

于是考虑二分出这段前缀。假设这段前缀的长度为 \(c\),我们希望在二分的过程中 check 的复杂度和 \(n\) 无关而和 \(c\) 有关,所以需要倍增二分。具体地,从大到小枚举 \(x\),使得 \(2^x\le c<2^{x+1}\),然后在 \([2^x,2^{x+1})\) 内二分即可。

接下来需要再加入一些区间,而不改变最小点覆盖的数量。考虑怎么刻画这件事情。

对于 \([1,c]\) 内的这些区间,按照右端点排序,然后贪心,可以得到一组最小点覆盖的解。这组解是所有解里面最靠右的。把区间反过来按左端点排序,然后贪心,可以得到所有解里面最靠左的。于是我们可以得到 \(k\) 个区间 \([sl_i,sr_i]\),意思是最小点覆盖里面的第 \(i\) 个点需要在的区间。这些区间显然是不交的,否则最小点覆盖的数量可以减少。

在加入一个区间 \([l,r]\) 时,考虑它会怎么影响上述的 \(k\) 个区间:

  • 如果 \([l,r]\) 和任意 \([sl_i,sr_i]\) 无交,那么它不合法;
  • 如果 \([l,r]\) 包含了任意 \([sl_i,sr_i]\),那么它可以直接计入答案,且不会对 \([sl,sr]\) 造成影响;
  • 如果 \([l,r]\) 仅和一个 \([sl_i,sr_i]\) 相交,那么它可以计入答案,并需要将这个 \([sl,sr]\) 更新为两个区间的交;
  • 如果 \([l,r]\) 恰和 \([sl_i,sr_i],[sl_{i+1},sr_{i+1}]\) 有交,这个时候它暂时不会造成什么影响,但当 \([sl_i,sr_i]\)\([sl_{i+1},sr_{i+1}]\) 产生变化时,它可能又有影响了。所以我们对每个 \([sl,sr]\) 维护一个优先队列,把 \([l,r]\) 暂时加入 \(i\)\(i+1\) 的优先队列内。当一个 \([sl,sr]\) 产生变化时,将优先队列内那些需要更新的位置更新即可。

现在还剩下一个问题,怎么快速找到和某个 \([sl,sr]\) 有交的第一个区间 \([l,r]\)。再使用一个优先队列,维护和每个 \([sl,sr]\) 有交的第一个区间。由于 \([sl,sr]\) 的总变化量是 \(O(c)\) 的,所以这个优先队列被更新的次数也理应是 \(O(c)\) 的。

但是还是存在问题,如果有个 \([l,r]\) 包含了很多个 \([sl,sr]\),这个 \([l,r]\) 就会被加入优先队列很多次。但注意到此时无论 \([sl,sr]\) 怎么更新,\([l,r]\) 都一定合法,所以可以直接把 \([l,r]\) 删掉。这下复杂度就对了,是 \(O(n\log^2n)\)

https://zhengruioi.com/problem/3237

考虑 \(k=1\) 怎么做。直接上回滚莫队。

考虑根号分治。对于 \(>B\)\(k\),可以放在一起做,只跑一遍莫队,复杂度 \(O(m\frac{V}{B})\)。对于 \(\le B\)\(k\),把 \(k\) 相同的询问放在一起做,那就变成了 \(k=1\),跑回滚莫队,复杂度 \(O(n\sqrt {m_i})\)。取 \(m_i=\frac{m}{B}\) 时最劣,为 \(n\sqrt{mB}\)

\(n,m,V\) 同阶,那么 \(B\)\(n^\frac{1}{3}\) 最优,复杂度 \(O(n^\frac{5}{3})\)

posted @ 2025-10-20 20:48  Egg_eating_master  阅读(13)  评论(0)    收藏  举报