我的二分队列决策单调性启蒙题。设
N,M,W 同阶。
拿一个 dp 算答案。设计 dp 状态
fi 表示经过第
i 条边,当前时刻是
Bi 的答案。按照
Ai 从小到大转移。容易列出转移式
- fi=minYj=Xi,Bj≤Ai(ci+fj+TXi×CostBj+1,Ai−1)。
其中
Costl,r 表示左端点大于等于
l,右端点小于等于
r 的饭的数量。这可以拿主席树搞掉。
预处理
Cost 时间复杂度
O(N2),主席树是
O(N2logN)。前者没前途。
仔细一看发现这个 dp 满足四边形不等式,那么就有决策单调性了。考虑二分队列。
首先,先按照
Ai 对每条边排序,记排序后的边数组为
e。依次将
ei 标号称作
idi。
依次令
idi←csXei,rfXei,idi←ei,csXei←csXei+1。记
Vali,j=ci+fj+TXi×CostBj+1,Ai−1。
由于有星球的限制,所以对每个星球开一个
deque 叫做
dqi。
dqi 的每一个元素都是一个三元组
(x,l,r) 满足
x 对
rfi,l∼rfi,r 做决策。
考虑向
dqi 中插入一个
x:
- 首先,记队尾三元组为 (x′,l′,r′)。若 Valrfi,l′,x′>Valrfi,l′,x 那么意味着 x 比 x′ 在 rfi,l∼rfi,r 上更优,直接删掉三元组继续下一次判断;
- 否则,二分出一个 mid 满足 Valrfi,mid,x′>Valrfi,mid,x,Valrfi,mid−1,x′≤Valrfi,mid−1,x,修改队尾三元组 (x′,l′,r′) 至 (x′,l′,mid−1),新增三元组 (x,mid,csi−1);
- 若某时刻队中不存在元素,直接新增三元组 (x,0,csi−1)。
记如上操作为
add(i,x)。
- 首先,记 dqXi 队头三元组为 (x,l,r)。若 r<idi 则说明 x 不在 i 上最优,直接删掉三元组继续下一次判断;
- 否则直接令 fi=Val(i,x);
- 若某时刻 dqXi 中不存在元素,直接设置 fi=+∞。
记如上操作为
ask(i)。
每个星球维护一个小根堆
pqi,按照
Bj 从小到大排序。在按
ei 顺序转移时按如下方式执行操作:
- 若 pqXei 队头 x 满足 Bx≤Aei 则执行 add(Xei,x) 并删除队头继续判断;
- 否则执行 ask(ei);
- 接下来在 pqYei 中插入 ei。
时间复杂度
O(Nlog2N)。