学习把连续运动判定转成测速仪下标区间,并把两种颜色的完整历史压成“当前颜色末值 + 另一颜色末值”。
前置:二分、区间刺点贪心、动态规划、Lazy 全局加思想。
《超速检测》若按每车逐监测器模拟会产生二次量访问,《染色》若把两个序列的选择进度全放进状态又会得到平方状态。两题的降维分别来自“物理不等式在单调位置上形成区间”与“下一步只与已取元素的边界色有关”。
>,速度恰等于限速不能计入。对每辆车先找第一个不小于驶入位置的测速仪,再按加速度与整数速度平方不等式二分区间另一端。非空区间计入检测车辆。将区间按右端点排序;若上次保留点不在当前区间,就保留当前右端点。
区间右端点是当前及以后所有可选点中最早的,不会比任何其他选择减少覆盖后续区间的机会;交换可得到存在最优方案选它。故保留点数最小,关闭数为 m 减它。
复杂度 $O((n+m)\log n)$。
for each car:
derive detector-index interval where speed_squared(position) > limit_squared
sort nonempty intervals by right endpoint
last = none; kept = 0
for [l,r]:
if last < l: keep detector r; last=r; kept++
output interval_count, m-kept
(lastRed,lastBlue) 是值域平方;颜色交换对称可固定一边末值为当前元素。处理到 i,设当前活动颜色末值为 $A_i$,dp[x] 表示另一颜色末值为 x 的最优分。维护所有 dp 的全局加量与基值最大值。到新值 y:切换颜色候选为 max(globalBest, dp[y]+y);继续当前颜色若 y 等于旧当前值则给所有状态加 y;最后用切换候选点更新状态 oldCurrent。
任一染色方案在处理前缀后可交换红蓝名称,使当前元素属于活动颜色,故状态无损。下一元素只有继续或切换两种,转移完全覆盖。继续奖励只由 y 与旧当前值决定,切换奖励只由 y 与另一末值决定,因此聚合公式精确。
每步 $O(1)$,空间 $O(\max A_i)$。
dp[empty_other] = 0; current = A[1]; global_add = 0
for y in A[2:]:
switch_value = max(best_dp + global_add, dp[y] + global_add + y)
if y == current: global_add += y
dp[current] = max(dp[current], switch_value - global_add)
current = y
answer = best_dp + global_add
《超速检测》先在 128 位整数中解速度平方不等式,再用两次二分将实数/整数边界落到监测器下标;贪心覆盖时按区间右端排序。《染色》的状态中要明确“上一个取自哪个序列”,相同位置色值不能代替来源维度;转移时使用新层数组,防止一个元素在同层被取多次。
超速检测把连续实数运动压成离散区间;染色把两维历史压成一个值与全局偏移。两者都先找单调/对称结构,再选择数据结构。
oldCurrent 状态?物理题用离散时间模拟小数据;染色题枚举 $2^n$ 染色对拍,覆盖连续相等、全不同、零状态不存在等情况。