题目链接
做法
计算 $ W(S) <= i $ 比 $ W(S) = i $ 容易得多,设最后结果为 $ sum[i] - sum[i - 1] $ ,其中 $ sum[n] = 2^{count~leaf} - 1 $ 。
先做一次 $ dfs $ 找到决策路径。对于每一个 $ i \in [l, r] $ ,令 $ dp[i] $ 表示 $ i $ 的子树有多少种方案是无法改变根节点的值的,用总集合数减去就得到可以改变的方案数。
然后得到一个 $ O(n \times (r - l + 1)) $ 的算法。
1 |
|
发现每个叶子节点只会被改变一次,然后这个问题可以变成一个动态DP。
考虑决策路径上的节点是无用的,将树进行重链剖分,以每一个决策路径的点作为根进行动态DP。
卡常数可以用向量代替矩阵。
时间复杂度 $ O(n \log n) $ 。
1 |
|