题目大意
给定两个数组 $A=\langle a_1,\cdots,a_n \rangle$ 和 $B=\langle b_1,\cdots,b_m \rangle$,定义 $A+x$ 表示 $\langle a_1+x,\cdots,a_n+x \rangle$,求 $\sum_{x=-10^{100}}^{10^{100}} LCS(A+x,B)$。
$n,m \le 4000,\ \ |a_i|,|b_i| \le 10^8$
10s,16MB
题解
首先,这么大的 $x$ 范围里,必定有很多是无贡献的。有贡献的 $x$ 的数量不超过 $nm$ 个,因为 $a_i+x=b_j$ 这样的等式只有 $nm$ 个。
这相当于说,对于一个固定的 $x$,在一个 $n$ 行 $m$ 列的矩阵上,把符合 $a_i+x=b_j$ 的格子 $(i,j)$ 做标记,在每一个标记点可以走到其右下方的任意标记点,问从左上走到右下的最长距离。
再往下想,每一对 $(i,j)$ 对应的 $x$ 是唯一的,也就是每种 $x$ 产生的标记总数也只有 $nm$。那么只要想办法把每种 $x$ 产生的标记弄出来,就可以 dp 了。
如果没有空间限制,那么就 $O(nm)$ 枚举所有的数对即可。这个 dp 是个简单的 LIS。
现在有空间限制,那么就需要用一些方法按顺序生成 $(x,i,j)$ 三元组。可以把 $b$ 数组从小到大排序(记为 $b’_1,\cdots,b’_m$),初始在堆里加入所有 $(b’_1-a_i,i,1)$,然后每从堆里取出一个元素,就把 $b’$ 向前推进一位,这样就能顺序生成所有 $(x,i,j)$ 三元组了。
代码
1 |
|