【SD 集训】20230424 T2 点(point)

题目描述

数轴上有 \(n\) 个点,第 \(i\) 个点的坐标为 \(x_i\)

对于每个点,你要将它左移或右移 \(d\) 个单位长度,不能不移。每个点的选择可以不同,两个点可以重合。

然后你要放置一些闭区间,使得每个点被至少一个闭区间包含。放置 \([l,r]\) 的代价为 \(a+b(r-l)\)

求最小的代价和。

数据范围:\(1\le n,d,x_i\le 150\)\(1\le a, b\le 10^6\)

题解

首先转化一下题面,等价于初始有 \(n\) 个点,对于每个点,你要将它右移 \(2d\) 个单位长度,或者不移。

一下描述均建立在 \(d:=2d\) 的基础上。

我们对 \(d\) 的值域进行分治:

  1. \(d\le B\):做法和 CF1730F 一样,直接状压即可。我们相当于拆贡献,对于每个点,我们找到它的上一个点并算出距离 \(len\),则代价为 \(\min\{a,b\times len\}\),相当于是两种选择,一种是新开一条线段,另一种是接着上一条线段继续。

    时间复杂度 \(O(n2^B)\)

  2. \(d>B\):不妨把这些点按照坐标分成一个矩阵,每行 \(d\) 个元素。这样一次操作相当于把一个点移到下一行去。

    像上一种情况一样算贡献在这里并不好做,我们考虑换一种计算方式,我们直接对每个点记录是否被覆盖,再根据上面一个点是否被覆盖计算答案。

    我们考虑按列 DP,首先,第一列我们不清楚前面一个格子是否被覆盖,所以我们先枚举最后一列的覆盖状态 \(lastmask\)。我们 DP 状态设 \(f_{i,mask}\) 表示处理到第 \(i\) 列,这一列的覆盖状态为 \(mask\),值为最小代价。最后答案就是 \(f_{n,lastmask}\)

    吐槽一下:情况 2 这个 DP 在 He_ren 的题解里就有两句话讲完了:

    d 大的时候,每次填完所有 mod 2d 意义下相等的位置。
    可以看成一个 (X / 2d) * (2d) 的矩形。

    只能说他说的没错。。。国家队选手是这样的。

    认为 \(x\)\(n\) 同阶,时间复杂度 \(O(\frac{n}{B} 4^B)\)

总时间复杂度为 \(O(n2^B+\frac{n}{B} 4^B)\)\(B\)\(\sqrt{2n}\) 即可做到 \(O(n2^{\sqrt{2n}})\)

代码

待填坑。

posted @ 2023-04-25 19:07  zhaohaikun  阅读(26)  评论(0)    收藏  举报