1 条题解
-
0
点的移动:题解
思路
若一个区间初始时已包含某个点,它不需要任何代价,可以删除。若区间 包含区间 ,访问 的移动轨迹必然也访问 ,所以 也可以删除。把点排序,并按左端点降序、右端点升序扫描区间,维护已保留区间的最小右端点,即可在线性扫描中删除所有包含其他区间的区间。剩余区间按左右端点都是递增的。
剩余的每个区间一定处于某两个相邻点之间,或位于所有点的左侧、右侧。两个相邻点之间的一组区间只能由这两个点访问;由于区间两端同序,最优分配必然是一个前缀交给左点,剩余后缀交给右点。
若一个点为了访问其左侧区间需要向左走最远距离 ,为了访问右侧区间需要向右走最远距离 ,最小移动代价为
定义 为处理完前 个点,并把点 与点 之间区间的前 个分给点 时的最小代价。
做法
子任务 1 枚举每个尚未访问区间由哪个点负责。确定分配后,对每个点分别求最远左、右距离并计算路线代价。复杂度为 。
子任务 2 使用上述动态规划直接枚举相邻两层状态。若相邻组分别有 个区间,转移复杂度为 ,总复杂度不超过 。
满分做法优化转移。固定当前点的右行距离 ,左行距离 随上一层状态单调递减。把状态分成 与 两段:
- 时,新增代价为 ;
- 时,新增代价为 。
分别预处理 的前缀最小值和 的后缀最小值,再用双指针维护两段分界,即可让每个状态 转移。所有组的状态总数为 。
复杂度
排序复杂度为 ,动态规划复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1290
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者