三轮省集
感谢 @BYR_KKK 的评论提醒,修正了标题。
Human Exercise
[CTS2022] 袜子
众所周知,形如 \(\sum_{i,j}[c_i=c_j]\) 的静态区间查询问题,复杂度不会低于 \(O(n\sqrt n)\) 的莫队做法。
这道题我们仍然尝试莫队,注意到一个半平面 \(Ax+By+C<0\) 可以变形为 \(\frac ABx+y+\frac CB<0\),只有两个参数,等同于区间,所以感觉上就很可做。
假设点的坐标范围是 \((-W,W)\times (-W,W)\) 之间均匀随机的。
lxl 课上讲了一个经典问题:
- 平面上随机生成 \(n\) 个点,多次进行半平面的点数查询。
做法是按照 \(L=W/\sqrt{n}\),将平面划分为 \(\sqrt n\times\sqrt n\) 个边长为 \(L\) 的小正方形。对于一次询问,对每一行,都是一个后缀的整块 + 最开始的一个散块。由于数据随机,散块内期望只有 \(O(1)\) 个点,暴力枚举。对于整块预处理后缀和。
由此受到启发,尝试在此基础上莫队。
将直线(半平面)按照在 \(x=-W\) 处的截距,每 \(L\) 的长度分为一组,总共 \(\sqrt n\) 组。对于每一组的直线,按照斜率排序,然后莫队。我们断言:莫队需要改动的次数是 \(O(n\sqrt n)\) 级别的。
经过验证次数大概是对的(需要分讨四种象限的半平面和 \(A=0,B=0\) 共 6 种情况,才能保证次数正确;关于次数,随机数据下,实际上很难卡掉,应该也能证明,还没仔细想;upd:P8529)。于是只需要考虑如何快速找到这些新加入 / 已经加入需要删除的点。
假设上一条直线为 \(P\),这一条直线为 \(Q\)。
还是考虑分为 \(L\times L\) 的小块,对每一行找到被夹在 \(P\) 和 \(Q\) 之间的列,暴力判断,由于此处点的坐标随机,复杂度是正确的 \(O(n\sqrt n)\),在时间复杂度上吊打一众不基于数据随机的 \(O(n\sqrt n\log n)\) 做法。
以上分析默认了 \(n,m\) 同阶,对于 \(n,m\) 不同阶的情况,如果设 \(L=W/S\),则复杂度为 \(O(m\sqrt n?+mn/S+mS)\),取 \(S=\sqrt n\),得到复杂度 \(O(m\sqrt n?+m\sqrt n)\)。
[PA 2020] Tekstówka
这题的 \(n\) 和 \(q\) 很不平衡,因此可能可以利用的性质就是平衡预处理和询问部分的复杂度,以及 \(|\Sigma|=26\)。
先考虑这样一个问题:
给定字符串 \(S,T\),\(q\) 次询问指定 \(S\) 的一个子串 \(S[i,j]\) 和 \(T\) 的一个前缀 \(T[1,k]\) 求 lcs。
朴素的求法是 \(O(n^3+q)\) 的;如果使用 bitset 优化,复杂度为 \(O(n^3/w+q)\)。下面介绍一种基于四边形不等式状物的 \(O(n^2+qn)\) 算法。
设 dp 数组:
- \(f(i,j,k)\) 表示 \(S[i,j]\) 和 \(T[1,k]\) 的 lcs。
显然,\(0\le f(i,j,k)-f(i,j,k-1),f(i,j,k)-f(i,j-1,k),f(i,j,k)-f(i-1,j,k)\le 1\)。
下面我们将变化 \(j,k\) 两个维度,维护 \(i\) 这一维度的序列。
回顾转移式 \(f(i,j,k)=\max(f(i,j,k-1),f(i,j-1,k),[S_j=T_k](f(i,j-1,k-1)+1))\)。
考虑 \(f(i,j,k)\) 和 \(f(i,j+1,k)\) 以及 \(f(i+1,j,k)\) 和 \(f(i+1,j+1,k)\):
- \(f(i,j,k)<f(i,j+1,k)\Rightarrow f(i+1,j,k)<f(i+1,j+1,k)\);
类似的:
- \(f(i+1,j,k)<f(i+1,j,k+1)\Rightarrow f(i,j,k)<f(i,j,k+1)\)。
这两条性质表明:
① 当 \(\text{++}j\) 时 dp 值在 \(i\) 的维度 +1 的是一个后缀,记作 \([p(j,k),n]\)。
② 当 \(\text{++}k\) 时 dp 值在 \(i\) 的维度 +1 的是一个前缀,记作 \([1,q(j,k)-1]\)。
且可以通过 \(p(j,k)\),\(q(j,k)\) 和 \(S_j\) 是否等于 \(T_k\),来递推出 \(p(j+1,k+1)\) 和 \(q(j+1,k+1)\)。
算法流程就是这样,先 \(O(nm)\) 预处理出 \(p(j,k)\) 和 \(q(j,k)\),再对于一组询问 \(O(\min(n,m))\) 差分,最后 \(O(n)\) 还原得到 \(i\) 一维的 dp 值。
现在回到原问题,对 \(T\) 使用分治处理跨过区间中点的询问,对于挂在线段树节点上的询问使用上述方法得到 \(j,k\) 固定 \(i\) 的 dp 值和 \(i,k\) 固定 \(j\) 的 dp 值后对应点位相加取一个最优即可。时间复杂度 \(O(n^2\log n+qn)\)。

浙公网安备 33010602011771号