写挂了 QwQ,但是思路是对的。
显然 T≥dk+dmin{t1,t2},t1≤t2 时可以取等,在原地等 d 个铁然后直接出发即可。
t1>t2 不能取等。此时路径必然是多个折返,设距离 d 的子问题答案为 f(d),则
f(d)=i=0mind−1max{dk,f(i)+it2}+it2+(d−i)t1=dt1+i=0mind−1max{dk+i(t2−t1),f(i)+i(2t2−t1)}=换元dt1+i=0mind−1max{A(d,i),B(i)}
众所周知,分段函数的最小值是每一段的最小值的最小值。A(d,i) 关于 i 单调递减,而 B(i) 与 d 无关,可以数据结构维护。因此只需知道如何分段。
A 主导时
dk≥f(i)+it2=defg(i)
因为 g(i) 单调递增,d 增加时分界点必不左移,可以直接挪分界点,不必二分。此时 B(i) 相当于滑动窗口,单调队列维护即可。
单组测试数据时间复杂度 O(m)。
我们可以使用算子大大简化问题。记 Df(x)=f′(x),因为 D 是线性算子,记 f(x)+f′(x)=(1+D)f(x)。
F2k(x)=⋯(1+D)(1−D)F0(x)=(1−D2)kF0(x)G2k(x)=⋯(1−D)(1+D)G0(x)=(1−D2)kG0(x)
由二项式定理,
(1−D2)kf(x)=i=0∑k(−1)i(ik)D2if(x)
记 [xt]f(x) 为 f(x) 的 t 次项系数,则有
[xt](1−D2)kf(x)=i=0∑k(−1)i(ik)[xt]D2if(x)=i=0∑k(−1)i(ik)(t+2i)2i−[xt+2i]f(x)=i=0∑k(−1)i(ik)t!(t+2i)![xt+2i]f(x)
在 t+2i>m 的时候直接 break,时间复杂度 O(m2)。
以上是 n 为偶数的情况,如果 n 为奇数,可以先求 Fn−1(x),Gn−1(x),最后一次运算 O(m),可以直接暴力。