题意
给定 (n) 个点的树,初始所有颜色都是 (0) ,每个点有一个阈值 (t) ,每次可能会让一个点的颜色异或1,问每次操作之后有多少个点满足子树内的颜色为 (1) 的点的个数 (>t) 。
(nle 10^5)
分析
-
考虑将询问分块,每个块内的被修改的点拿出来建虚树,虚树上的点维护到原树上到虚树父亲的路径上所有的点(不包括自身)的两个信息:
-
(t_u-siz_u) ,其中 (siz_u) 表示子树内颜色为 (1) 的点的个数,将排序后的序列记为 (f)。
-
所有点加上了多少的贡献 (adv) 。我们要查询的就是有多少点满足 (t_u-siz_u-adv<0) 。
-
-
如果一个点 (x) 的颜色进行了修改,考虑暴跳虚树,并修改虚树节点上的答案(因为 (x) 的颜色改变所以要单独讨论)以及对应的 (f) 。因为将询问分块处理,所以每棵虚树的大小不会超过 (sqrt n) 。
-
本题因为块数不超过 (sqrt n) 所以构建虚树的方式可以采用遍历。
-
总时间复杂度 (O(nsqrt n logn))