三轮省集

感谢 @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)\)

posted @ 2025-05-26 22:17  Network_Error  阅读(67)  评论(3)    收藏  举报