FZOJ 3036 /#3539. 「JOI Open 2018」-- Cats or Dogs
FZOJ3036 Cats or Dogs解题报告
算法一(38pts):
考虑树形\(dp\), 设\(dp\)状态\(f_{i, 0}/f_{i,1}\)分别表示让\(i\)子树满足条件且第\(i\)个点处于猫的联通块的最小代价以及处于狗的联通块的最小代价。
于是有\(dp\)转移方程
-
\[f_{u,0} = (a[u]== 2) * inf + \displaystyle\sum_{v=son[u]}^{}min(f_{y,0}, f_{y, 1} + 1) \]
-
\[f_{u,1} = (a[u] == 1) * inf + \displaystyle\sum_{v=son[u]}^{}min(f_{y,0} +1, f_{y, 0}) \]
时间复杂度: \(O(nq)\)
算法二 (100pts) :
修改每个点只对他的祖先有影响,考虑树链剖分。 不妨设\(g_{i,j}\)表示不带重儿子的\(f_{i,j}\), 那么上述方程式显然可以化为广义矩阵乘法的形式。 因为要求动态修改,所以我们可以用线段树维护矩阵乘法。
具体的来说,对于每个点\(x\), 我们可以快速找到的它的重链顶部, 然后对于这部分, 我们之后可以用线段树快速查询, 但是重链顶部是它父亲的一个轻儿子, 所以我们要用顶部值更新他父亲的对应矩阵。 然后每次向上跳。
对于每个询问,找\(1\)所在重链的矩阵乘积即可。
时间复杂度: \(O(n\log_{2}n)\), 但常数巨大。

浙公网安备 33010602011771号