题解:CF1983G Your Loss
liujiaxi123456 · · 题解
核心思路
按位拆分
题目要求计算
对于第
令
我们只需要分别维护这三项,最后乘上
三项的计算方法
对于固定的位
-
Term 1:
\sum b_k(a_v) -
这是基础的树上路径点权和。
-
预处理根到每个点的前缀和
pre\_a ,通过pre\_a_x + pre\_a_y - 2 \cdot pre\_a_{LCA} + \dots O(1) 计算。
-
-
Term 2:
\sum b_k(\text{dist}) -
这是一个纯数学问题,与节点权值
a_v 无关。 -
条件
b_k(\text{dist}) = 1 等价于\text{dist} \pmod M \in [2^k, M-1] 。 -
由于
\text{dist} = C \pm dep_v ,这转化为dep_v \pmod M 落在某个特定区间。 -
我们只需要计算深度区间
[D_{min}, D_{max}] 内有多少个数模M 落在目标区间内。这可以O(1) 计算
-
-
Term 3:
\sum (b_k(a_v) \land b_k(\text{dist})) -
这是难点。我们需要统计路径上满足
b_k(a_v) = 1 且dep_v \pmod M 在特定区间[L, R] 内的节点数。 -
离线 + DFS + BIT:
-
我们将询问挂载在节点上,利用 DFS 序和差分思想。
-
在 DFS 过程中,维护一个大小为
M 的树状数组 (BIT)。BIT 的下标是dep_u \pmod M 。 -
进入节点
u :如果b_k(a_u) = 1 ,在BIT_{dep_u \pmod M} 处加1 。 -
处理询问:在节点
u 处查询 BIT 的区间和query(L, R) 。利用差分:Ans(Path) = Query(x) - Query(fa_{LCA}) \dots 。 -
离开节点
u :回溯,在BIT_{dep_u \pmod M} 处减1 。
-
-
复杂度分析
-
时间复杂度:枚举
20 个位。对于每个位,进行一次 DFS 处理所有询问。BIT 操作为O(\log M) = O(k) 。总复杂度约为O(\log V \cdot (N+Q) \cdot \log (\max M)) 。 -
空间复杂度:
O(N+Q) ,使用内存池和静态数组优化。