专栏文章

AGC072E

AT_agc072_e题解参与者 4已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@minqs5be
此快照首次捕获于
2025/12/02 06:49
3 个月前
此快照最后确认于
2025/12/02 06:49
3 个月前
查看原文
帅爆了这个题。
二分答案,初始有 xx 的钱,转换为判定性问题。不妨先考虑链的情况,一个结论是,每次将里程换成钱时要么全部换完,要么换到的钱能恰好使用到下一次兑换;否则考虑调整,设两次相邻的兑换分别在 x,yx,y,且在 xx 处既没有把里程用尽,到 yy 时钱也没有用完,则必然可以取一个 ε>0\varepsilon>0,将 xx 处兑换的里程数增加/减小 ε\varepsilon,必有一者更优。
将每个点细拆成到达和离开时刻,则在每个兑换点上,要么其离开时刻里程为 00,要么在下一个兑换点的到达时刻钱为 00。离开时刻里程为 00 的兑换点称为 A 类特殊点,将到达时刻钱为 00 的点称为 B 类特殊点,则相邻两特殊点间至多隔了一个兑换点,那一个兑换点的情况这仅在两特殊点分别为 A、B 时产生。则令 fi,gif_i,g_i 分别为 ii 作为 A/B 类特殊点时,离开时最多拥有多少钱/里程;转移考察 (i,j)(i,j){A,B}2\{\tt A,B\}^2 的四种情况。
将判定性问题的解法拓展到一般图,显然两交换点间肯定走关于钱的最短路,确定所有兑换点后直接退化到链的情况,故上述所有结论仍然成立!记 du,vd_{u,v}(u,v)(u,v) 间钱最短路长度,这里给出详细的转移:
  1. (u,v)=(A,A)(u,v)=(\tt A,A):则在 vv 处兑换当前拥有的所有里程,这仅在 uvu\to v 路径上获得,即 fvfudu,vF+du,vRvf_v\gets f_u-d_{u,v}F+d_{u,v}R_v 需满足 fudu,vFf_u\ge d_{u,v}F
  2. (u,v)=(A,B)(u,v)=(\tt A,B):在上一兑换点仅兑换能到 vv 的钱,枚举经特殊兑换点 xx,即 gvdu,xmax(dx,vF(fudu,xF),0)Rx+dx,vg_v\gets d_{u,x}-\frac{\max(d_{x,v}F-(f_u-d_{u,x}F),0)}{R_x}+d_{x,v} 需满足 fudu,xFf_u\ge d_{u,x}Ffudu,xF+disu,xRxdx,vFf_u-d_{u,x}F+dis_{u,x}R_x\ge d_{x,v}F
  3. (u,v)=(B,A)(u,v)=(\tt B,A):则在 vv 处兑换当前拥有的所有里程,且在上一兑换点仅兑换能到 vv 的钱,则此时钱完全由本次兑换产生,即 fvgvRvf_v\gets g_vR_v
  4. (u,v)=(B,B)(u,v)=(\tt B,B):在上一兑换点仅兑换能到 vv 的钱,即 gvgudu,vFRu+du,vg_v\gets g_u-\frac{d_{u,v}F}{R_u}+d_{u,v} 需满足 guRudu,vFg_uR_u\ge d_{u,v}F
使用 Bellman-Ford 模拟上述过程,松弛一个点再转移复杂度为 O(n2)\mathcal{O}(n^2)。由于成环必然不优,故松弛总轮数不超过 nn 次,总复杂度为 O(n4logV)\mathcal{O}(n^4\log{V})
注意到最终答案下,fnf_n 的值固定为 00,将上述 dp 倒序(并非转置原理,这里不是简单的线性变换),记 fu,guf_u,g_uuu 作为 A/B 类点,想要到达 nn 得最少有的钱/里程,转移即对以上的 dp 解不等式,得:
  1. fumax(fvdu,vRv,0)+du,vFf_u\gets \max(f_v-d_{u,v}R_v,0)+d_{u,v}F
  2. fumax(disx,vF(du,x+dx,vgv)Rx,disx,vFdisu,xRx,0)+du,xFf_u\gets\max(dis_{x,v}F-(d_{u,x}+d_{x,v}-g_v)R_x,dis_{x,v}F-dis_{u,x}R_x,0)+d_{u,x}F 要求 du,x+dx,vgvd_{u,x}+d_{x,v}\ge g_v
  3. gvfvRvg_v\gets \frac{f_v}{R_v}
  4. gumax(gvdu,v,0)+du,vFRug_u\gets\max(g_v-d_{u,v},0)+\frac{d_{u,v}F}{R_u}
如此可以去掉二分,直接求解。但复杂度是 O(n4)\mathcal{O}(n^4) 仍然无法接受。
一个性质是,在旅行过程中,钱 + 里程 ×F\times F 的值不增。走过一段路时该值不变,进行兑换时由于 R<FR_*<F 故该值减少。在上述恰好相反的 dp 过程中,将 fu/guf_u/g_u 分别赋权值 fu,gu×Ff_u,g_u\times F,每次取出权值最小的,拿他取松弛其余点,则按照该顺序,一个被取出过的点不会再被其他点松弛(将 fu,guf_u,g_u1u1\to u 的最终状态为 (fu,0)(f_u,0)(0,gu)(0,g_u) 的路径)!这相当于一个 dijkstra 的过程。复杂度降至 O(n3)\mathcal{O}(n^3)

评论

3 条评论,欢迎与作者交流。

正在加载评论...