【题解】CF1140G Double Tree 虚树 倍增

题目链接

P5024 [NOIP2018 提高组] 保卫王国 类似,都是钦定路径端点状态的树上路径处理问题,一般思想即把询问点放在虚数上倍增处理。

考虑一个双射:给定一棵树,有两种状态,对应两种不同的边权组合,可以通过一定的花费随意切换状态,求从点 \(x\) 状态 \(a\) 游走到 \(y\) 状态 \(b\) 的最小花费。

对于从树上任一一条 \(a,b\) 之间的路径(包括非简单路径)一定要经过 \(a,b\)\(\text{LCA}\) ,并且对于树上的一条 \(a\to b\) 的非简单路径一定经过 \(a\to b\) 简单路径上的所有点和边。

\(f[i][j][0/1][0/1]\) 为从点 \(i\) 状态 \(0/1\) 游走到点 \(i\)\(2^j\) 级祖先且祖先的状态为 \(0/1\) 的最小花费,枚举中间点状态即可。

每次询问倍增到 \(pre\) 之后在 \(lca\) 合并即可。

代码记录

posted @ 2021-09-06 16:23  Themaxmaxmax  阅读(34)  评论(0编辑  收藏  举报