【题解】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\) 合并即可。