LOJ3494「JOISC 2021 Day3」保镖 题解

JOI 街是一条贯通东西的长街。我们将其抽象为一条数轴。
从现在起,将有 N 个贵宾(VIP)来到 JOI 街并大逛特逛。VIP 们以 1N 编号。VIP i (1iN) 将会在时刻 Ti 从坐标 Ai 前往坐标 Bi。其速度是每单位时间 1 单位长度。
如果 Ai<Bi,VIP i 将会以不变的速度在正方向上移动。类似地,如果 Ai>Bi,VIP i 将会以不变的速度在负方向上移动。
一个保镖的工作是在 JOI 街上巡逻并保护 VIP 们。为了保护一个 VIP,很有必要和 TA 一起逛一会街,同时保护 TA。当然,允许保镖在他们逛街逛到一半时才开始保护,或在他们逛街结束前就停止保护。开始和停止保护的时刻不必为一个整数
特别地,尽管可能有多个 VIP 在同一坐标,保镖也最多只能保护一个 VIP。
保镖可以在 JOI 街上以每单位时间最多 1 单位长度的速度随意走动。在他们停止保护一个 VIP 之后,可以去到另一个地方再开始保护另一个 VIP。如果一个保镖和 VIP i 一起逛街,那么 VIP 将会对他们一起走过的距离的每单位长度给保镖 Ci 元小费。这里保证 Ci 是偶整数。
作为一个安保公司的员工,您正在计划 Q 份保护 VIP 的方案。这些方案以 1Q 编号。对于方案 j (1jQ),一个保镖在时刻 Pj 时从坐标 Xj 开始工作。您的任务是分别最大化每个方案中的保镖能够得到的总小费。
请您编写一个程序对于给定的 VIP 和保镖的信息,计算每一个方案中保镖的最大总小费。
在此题的限制下,可以证明答案一定是个整数。
1N28001Q3000000


  数据结构 斜率优化 李超树 坐标转换

  神仙的题目,曾经的噩梦。

  原来的问题是一个一维的,但是还有根据时间的决策,于是我们可以把位置当做 x 轴,时间当做 y 轴,建立一个二维的坐标系描述问题。

  那么每一个 VIP 的走路方向就是从 (Ai,Ti)(Bi,Ti+|AiBi|),是一条斜率为 +1 或者 1 的直线,为了方便,我们可以将整个坐标轴顺时针旋转 45 度,也就是将 (x,y)(x+y,xy) 但是会将距离 ×2,有因为之前转换成二维问题,也将距离 ×2,于是总共答案 ×2,那么我们可以将 Ci 除以 2(所以 Ci 是偶数?)。

  为了方便,我们可以将所有 VIP 坐标离散化,那么转化出了一个 2N×2N 的网格图,然后转化后的问题如下:

有一张网格图,沿着每次只能向下或者向左走,每个网格图上的边都有自己的边权 Ci,只要沿着该边走 x 步,那么可以获得 Cix 的收益。
现在给出 Q 个初始点,问走出的最大收益是什么?

  因为网格图的大小可以承受,于是我们可以用 DP 求出当走到网格图格点 (i,j) 上的最大收益 dp(i,j)

  然后考虑从一个非格点的最大收益,最优方案一定是 先向左走到某一条网格边上然后向下走到格点 / 先向下走到某一条边上然后向左走到格点。

  先将所有询问离线,然后考虑每一行 / 每一列,计算 先向左再向下 / 先向下再向左 的贡献。

  注意到所有贡献是一个一次函数的形式,于是可以李超树求解,复杂度 O(n2logn+Qlogn)

  但是注意到 DP 数组有单调性,也就是每次加入的线段斜率必须递减,否则不优,于是可以用单调栈 + 二分维护,具体维护的是一个上凸壳,但是因为插入线段的 k 值依次递减,相当于我们在倒着插入,于是可以将图像关于 y 轴对称,然后就是正着插入了,复杂度 O(n2+Qlogn)

  具体实现有亿些细节,可以看代码

  btw,本来这个代码可以更短的,但是在校内 OJ 上被卡空间了,很有可能是因为评测机是 64 位,于是开的一堆 vector 就炸了,于是将原来 N×Nvector 变成了 2×Nvector,常数空间有所优化,终于在校内 OJ 上卡过去了。

posted @   Werner_Yin  阅读(152)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-02-24 Template
点击右上角即可分享
微信分享提示