把二维每日可控移动的可达域写成 Manhattan 球,再按周期余数把绝对值不等式化成四个关于周期数的一次约束。
前置:前缀和、绝对值、一次不等式、周期分解。
“求最少天数”容易让人立即二分,但风向会使第 $m+1$ 天的可达域不一定包含第 $m$ 天的可达域,全局谓词不单调。周期分解的真正作用不是少模拟几天,而是固定余数后把风位移与自主移动预算都写成完整周期数 $q$ 的一次式。
(x,y) 的最少非负天数或 -1。总 n 至 $10^6$。预处理一个周期前缀与总风位移。对每个 r=0..n-1,残差为目标减前 r 天风,再减 q 倍周期风。条件
$$ |X(q)|+|Y(q)|\le k(qn+r) $$
拆成四个 C*q<=R。若 C 正给上界,C 负给下界,C 为 0 检查常量。合并四个界,若非空则候选为最小 q;在所有 r 中取最小天数。
m 天自主动作的 Minkowski 和恰为半径 mk 的 L1 球:必要性由三角不等式,充分性可把目标自主位移按天拆成每段不超过 k。四符号表达与 L1 不等式等价。每个 m 有唯一 (q,r),枚举不漏;固定 r 的线性界求出全部可行 q,取最小不重。
复杂度 $O(n)$ 每组,使用 __int128 防止系数乘法溢出。
prefix_wind, cycle_wind = preprocess()
answer = infinity
for r in 0..n-1:
low, high = 0, infinity
for sx,sy in four sign pairs:
derive C*q <= R
intersect [low,high] with this inequality's integer solutions
if low <= high: answer = min(answer, low*n+r)
对每个余数 $r$,用有符号 128 位整数存四个不等式的系数与常数。处理 $Aq\le B$ 时必须按 $A>0,A=0,A<0$ 分类,负数除法不能直接依赖 C++ 向零截断,应封装数学意义的 floor/ceil divide。合并得到的 $q$ 下界还要与 0 取最大,然后用原 Manhattan 不等式回代一次,可快速抓出不等号和整除边界错误。
周期系统中“固定余数再研究周期数”常用于移动、自动机与取模 DP。若每日自主位移是欧氏球,四个线性约束会变成二次不等式,方法需调整。
对小 n、限制小天数逐日枚举 q/r 与网格自主移动,对拍线性界算法;重点覆盖系数为 0 和无上界情况。