1 条题解
-
0
题解
思路
递推的每一步从 走到 或 。倒过来看,一个询问 是从位置 出发做 次“原地或向左”移动,并把每次所在位置的 值累加。
若路径最左到达 ,其中 ,则区间 中每个位置至少访问一次,剩余的 次访问应全部放在这个区间的最小值处。对最终最优的 ,可以把该最小值取为 ,于是候选答案为
$$\operatorname{sum}_y-\operatorname{sum}_l+a_l(x-y+l),$$其中 。
做法
子任务 1:直接递推
按定义计算整个三角形:先令 ,再按 递增计算其余状态。预处理时间和空间均为 ,每个询问 。
子任务 2:逐个枚举最左位置
枚举 ,代入上式取最小值。预处理前缀和后,单次询问 ,总复杂度 ,空间 。
子任务 3:线段树维护凸包
把候选式整理为
$$\operatorname{sum}_y+ \min_{y-x+1\le l\le y} \left(a_l(x-y)+a_l l-\operatorname{sum}_l\right).$$每个位置 对应直线
询问需要在下标区间 内、横坐标 处求直线最小值。
在线段树每个结点中保存该下标区间全部直线的下凸包。建树时按斜率排序并删除永远不可能最优的直线;查询凸包时,直线值呈单谷形,可二分相邻值找到最小者。一个下标区间被拆成 个线段树结点,每个凸包查询再用 ,因此总复杂度为
空间复杂度为 。
所有乘法和前缀和均使用 64 位整数;判断三条直线冗余时使用 128 位整数避免交叉乘法溢出。
复杂度
- 子任务 1:时间 ,空间 。
- 子任务 2:时间 ,空间 。
- 满分算法:时间 ,空间 。
- 1
信息
- ID
- 1462
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者