Loading

FZOJ 3036 /#3539. 「JOI Open 2018」-- Cats or Dogs

FZOJ3036 Cats or Dogs解题报告

tags: 树形dp, 树链剖分,线段树,矩阵

算法一(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)\), 但常数巨大。

posted @ 2022-12-03 09:08  Absolutey  阅读(95)  评论(0)    收藏  举报