学习当答案只选常数个对象时保留少量最优候选,以及把区间乘法极值按符号缩成四类代表值。
前置:BFS、Top-k、RMQ/稀疏表、极值分类。
《假期计划》的四点选择有 $O(n^4)$ 组合,《策略游戏》的每次查询又像需要枚举两个区间的笛卡尔积。两题分别通过“为每个接口只留少数最优候选”与“乘积只由符号类型和端值决定”删掉这些枚举。
对每点 BFS 得可达矩阵。对每个 b,收集满足 reach[1][a] && reach[a][b] 的 a,保留分数前三。枚举可达的 b,c,再枚举两侧各至多三候选并检查四点互异。
任何最优方案的 a 若不在 b 的前三,前三中至多因等于 c,d 而淘汰两个,仍有一个分数不低且不冲突,可替换;d 同理。因此候选压缩不丢最优。复杂度 $O(n(n+m)+n^2)$。
reach = BFS_from_every_vertex(limit=k+1)
best3[b] = top 3 scores among a reachable from home and able to reach b
for b,c where reach[b][c]:
for a in best3[b], d in best3[c]:
if a,b,c,d distinct: maximize score sum
min(x*minB,x*maxB) 在正半轴、负半轴分别单调,最优只在靠近 0 或远端的代表值。稀疏表查询 B 的 min/max,以及 A 的 min/max、最小非负、最大非正。逐候选计算 Bob 的最坏乘积并取最大。A 任一正数的最坏值由 B 最小决定,在线性函数上最优位于正数区间端点;负数同理由 B 最大决定;四类代表覆盖这些端点与零。因此不会漏最优。
预处理 $O((n+m)\log(n+m))$,每问 $O(1)$。
minB,maxB = RMQ(B range)
candidates = {minA,maxA,smallest_nonnegative_A,largest_nonpositive_A}
answer = max(min(x*minB, x*maxB) for valid x in candidates)
《假期计划》先用限深 BFS 或全源可达性得到“距离至多 $k+1$”,再为每个点保留常数个分数最高候选;组合时必须显式检查四个景点互不相同。《策略游戏》的线段树节点应同时存正数最小/最大、负数最小/最大与零存在性;合并和查询时不要用 0 作“不存在”哨兵。
两题都把大候选集压成常数个代表:依据不是经验,而是“冲突数上界”或“分段单调性”。
假期计划用 n≤10 枚举四元组对拍;策略游戏用区间双重枚举对拍所有符号组合。