做题记录 26.2.27
\(\textcolor{black}\odot\) AT_agc072_e [AGC072E] Flights 2
显然离开某个位置时,要么恰好用完里程,要么到下一个点后恰好用完钱
令 \(f_u\) 表示目前在 \(u\) 里程为 \(0\) 走到 \(n\) 的最小钱数,\(g_u\) 表示目前在 \(u\) 钱数为 \(0\) 走到 \(n\) 的最小里程,初始 \(f_u=g_u=0\),答案为 \(f_u\)
预处理 \(d_{i,j}\) 表示两点之间的最短路,考虑 \(f,g\) 的转移
从 \(f_v\) 转移到 \(f_u\),显然是从 \(u\) 直接走到 \(v\) 且在 \(v\) 将里程全都换成钱,因此转移为
\[f_u\gets \max(f_v-d_{u,v}r_v,0)+d_{u,v}F
\]
从 \(g_v\) 转移到 \(g_u\),显然是在 \(u\) 将一部分里程兑换为钱,到 \(v\) 正好用光,转移为
\[g_u\gets \max(g_v-d_{u,v},0)+\frac{d_{u,v}F}{r_u}
\]
从 \(f_v\) 转移到 \(g_u\),一定是在 \(u\) 时一些里程兑换为钱,走到 \(v\) 时钱花光,然后将剩余里程兑换为钱,前一部分相当于 \(g_v\to g_u\),因此只需要考虑 \(f_v\to g_v\),转移为
\[g_v\gets \frac{f_v}{r_v}
\]
从 \(g_v\) 转移到 \(f_u\),可能存在一个中间点 \(x\),从 \(u\) 到 \(x\),在 \(x\) 兑换一部分里程,到 \(v\) 时正好用光,显然兑换点至多一个,转移为
\[f_u\gets \max(d_{x,v}F-\min(d_{u,x},d_{u,x}+d_{x,v}-g_v)r_x,0)+d_{u,x}F
\]
转移过程中 \(M+C\times F\) 不降,其中 \(M\) 为钱数,\(C\) 为里程数,可以用 \(\text{dijkstra}\) 算法
时间复杂度 \(O(\sum n^3)\)

浙公网安备 33010602011771号