跳转至

力场护盾:题解

解法比较

出题人解法用时间与位置的二维差分还原伤害,统计启用时可被保护的建筑,再用空间前缀和与单调队列求每个时刻的一次最大保护量。随后按时间做前向 DP:跳过当前时刻支付该时刻损失,或启用护盾并跳到作用和冷却结束后,支付这段区间的损失减去保护量。两类转移覆盖下一次启用的全部可能,区间互不重叠,故可得到最小总损失。

Codex(GPT-6)采用后向 DP:将不启用护盾的总损失作为固定基线,只累计被保护的收益。这与前向损失 DP 等价,差分与单调队列也相同。实现时须区分逐时刻损失和累计损失,并正确计算闭区间长度。设位置数为 \(W\) 、时间范围为 \(T\) 、输入记录总数为 \(I\) ,两者时间和存储上界均为 \(O(I+WT)\) .

无护盾时的损失

令 \(W\) 为工事坐标跨度加一,\(T\) 为最后一个事件的结束时刻。没有事件时直接输出 \(0\) .

在“位置、时刻”的二维网格上,用二维差分记录事件。轰炸贡献 \(+H\) ,维修贡献 \(-H\) .求二维前缀和后,得到位置 \(x\) 、时刻 \(t\) 的净损失 \(d_{x,t}\) .

设 \(c_{x,t}\) 为位置 \(x\) 在时刻 \(t\) 开始时已建成的工事数,用建成时刻的前缀计数得到。无护盾总损失为

\[ B=\sum_x\sum_{t=1}^{T}c_{x,t}d_{x,t} \]

再对每个位置的净损失沿时间做前缀和,记为 \(P_{x,t}\) .

一次开启的收益

若在时刻 \(t\) 开启护盾,结束时刻截断为 \(e=\min(T,t+R_s-1)\) .位置 \(x\) 能避免的净损失为

\[ g_{x,t}=c_{x,t}(P_{x,e}-P_{x,t-1}) \]

这里固定使用开启时刻的工事数 \(c_{x,t}\) ,因此不会错误保护后来建成的工事。维修贡献可能使 \(g_{x,t}\) 为负。

选择端点距离不超过 \(M\) 的闭区间,等价于选择最多 \(M+1\) 个连续整数坐标。对 \(g_{x,t}\) 做位置前缀和,用单调队列维护允许范围内最小的左端前缀,即可在 \(O(W)\) 时间内求出本次最大收益 \(G_t\) .收益允许取 \(0\) ,表示不使用护盾。

时间上的动态规划

令 \(F_t\) 表示设备在时刻 \(t\) 可用时,从此刻开始最多能避免的净损失。令 \(F_{T+1}=0\) ,从后向前计算:

\[ F_t=\max\left(F_{t+1},\ G_t+F_{\min(T+1,t+R_s+S)}\right) \]

第一项跳过时刻 \(t\) ;第二项在当前时刻开启一次,并在设备下次可用时继续安排。不同次护盾的生效时间不相交,因此收益可以相加。最终答案是 \(B-F_1\) .

正确性与边界

二维差分准确还原每个时刻各事件的总效果;工事计数只包含已经建成的工事,因此 \(B\) 是无护盾损失。公式 \(g_{x,t}\) 恰好计算一次护盾挡住的轰炸与维修总和,单调队列穷尽所有合法区间。任意最优安排在设备可用时,要么等待,要么立即开启;转移枚举了这两种情况。因此 \(F_1\) 是最大可避免损失,所得答案最小。

需要注意 \(M=0\) 仍对应一个坐标、损失允许为负、建成时刻等于开启时刻可以被保护,以及事件可能覆盖工事尚未建成的时段。

时间复杂度 \(O(n+A+B+WT)\) ,空间复杂度 \(O(n+A+B+WT)\) ;\(W,T\le3000\) .损失、收益和动态规划值使用 64 位整数。输入数组在转为网格后及时释放。