Dijkstra + 线段树.
两个方案 $[l_i,r_i],[l_j,r_j]$ 执行后能合并成一个健康区间的条件为 $R_i-L_j+1\ge |T_i-T_j|$ ,最后要合并成 $[1,n]$ .
可以看成从所有 $L_i=1$ 的区间出发,若区间 $i,j$ 能合并,则有边 $i\to j$ ,边权为 $C_j$ ,求到 $R_i=n$ 的区间的最短路.
考虑 $i$ 能向哪些 $j$ 连边,若 $T_j\le T_i$ ,则需要满足 $R_i-T_i+1\ge L_j-T_j$ ,否则需要满足 $R_i+T_i+1\ge L_j+T_j$ .
开两棵线段树,都以 $T$ 为下标,在 Dijkstra 过程中需要找 $i$ 的所有出边,在两棵线段树上分别找即可.
每个点的入边的边权是相同的,所以每个 $j$ 只会被 $dis$ 最小的 $i$ 更新,之后可以将其删去,时间复杂度 $O(n\log n)$ .
1 | //%std |