1 条题解
-
0
一、题意理解
我们初始有 棵线段树(编号 ),所有节点标记 。
两种操作:
-
修改操作 :
- 把当前 棵线段树每棵复制成两棵(新编号规则:原树 变成 与 ),于是树的数量 。
- 然后对所有编号为奇数的树执行一次 ,即对区间 打上懒标记(标记永久化,不下传,且标记为 后不会再变回 )。
-
查询操作 :
- 定义一棵树的权值 = 该树中 的节点个数。
- 求当前所有树的权值之和。
二、关键观察
设当前有 棵树,执行一次 :
- 复制前,每棵树 的权值为 。
- 复制后,树 和 初始权值都是 。
- 然后对奇数编号的树()进行一次 ,这次修改会给该树新增一些标记为 的节点(这些节点之前 ,现在变 )。
设一次 操作在一棵全新空树(全 标记)上执行后,新增的 的节点数为 (注意 只与 和线段树结构有关,与之前标记无关,因为标记永久化,已经为 的节点不会再新增)。
但是,如果树上某些节点之前已经是 ,那么这次修改不会重复计数。所以实际新增的节点数 = 在这次修改中被覆盖且原来 的节点的数量。
三、数学建模
设 表示在所有树中,节点 的 的树的数量。
初始 对所有节点。
当进行 时:
-
首先 ,并且对于任意节点,原来有 棵树该节点为 ,复制后,(因为每棵树复制成两棵,标记继承)。
-
然后对奇数编号的树(恰好一半的树)进行 。
对于在 中会被标记的节点 (即该节点对应的区间 ),在这次修改前,这些奇数树中该节点 的数量 = 奇数树总数 (因为复制后树总数为 ,奇数树有 棵)减去该节点在奇数树中已经是 的数量。
注意奇数树中该节点为 的数量 = 总 的一半(因为复制时均匀分配),即 。所以新增的 的数量 = 。
因此 $f_{node} \gets 2 f_{node} + \left(t - \frac{f_{node}}{2}\right)$。
化简:
对于被 完全覆盖的节点。
-
对于不被 完全覆盖的节点, 只是复制加倍:。
四、线段树维护
我们可以在值域 的线段树(用于模拟题中的线段树结构)上维护每个节点(指值域线段树的节点)的 。
每次 :
- 总树数量 (模 )。
- 对值域线段树进行区间更新:
对完全包含在 的节点 ,执行: 对不被 完全包含但与之相交的节点,需要递归,并标记懒标记。
注意 在模 下是 。
五、查询操作
查询时,答案 = (因为每棵树该节点为 就贡献 ,总贡献就是 )。
所以我们只需维护值域线段树的所有 之和 ,查询时输出 。
六、递推公式总结
设 = 当前所有树的权值和(即答案)。
设 = 当前树的数量。
初始:
操作 :
- 复制树:
因为每棵树权值复制成两份。
-
对奇数树进行 :
设 = 一次 在一棵全 标记树上新增的 的节点数(即该操作覆盖的节点数)。
注意 是固定的,只与 有关,可以在值域线段树上 计算。
在奇数树中,某个节点如果原本是 且被本次覆盖,才会新增 。
考虑某个节点 ,在所有树中它为 的比例是 (复制后、修改前)。
在奇数树中它为 的比例也是 (因为复制均匀)。
所以奇数树中该节点为 的比例是 ,奇数树总数是 ,所以新增数 = 。对所有被覆盖的节点求和:
$$\Delta = \sum_{u \in \text{cover}} t\left(1 - \frac{f_u}{2t}\right) $$即
$$\Delta = t\cdot |\text{cover}| - \frac12 \sum_{u \in \text{cover}} f_u $$其中 。
所以:
$$S'' = S' + \Delta = 2S + tA - \frac12 \sum_{u \in \text{cover}} f_u $$ -
更新 对于被覆盖的节点:
$$f_u' = 2f_u + \left(t - \frac{f_u}{2}\right) = \frac{3}{2}f_u + t $$对 。
七、实现方法
我们建一棵值域线段树,维护:
- : 区间内 之和。
- : 区间内被覆盖节点的 之和(用于计算 )。
- 标记 表示 。
操作 :
- 。
- 。
- 计算 = 覆盖的节点数(在递归时统计)。
- 递归更新区间 :
- 对完全包含在 的节点,打标记 ,并记录它们的 到 。
- 对部分包含的,递归下去。
- 。
- 。
查询 :输出 。
八、复杂度
每次 ,总 。
九、示例推导(对应样例)
初始 。
第一次查询:输出 。
操作 :
- 。
- 。
- = 覆盖节点数: 对应节点 (可能拆成 和 等,根据线段树结构),假设标准线段树 结构: 根 不包含在 ,递归: 左 包含,右 不交。 左 不完全是叶子,递归: 包含, 包含。 所以覆盖节点:, , 三个节点。 所以 。
- 初始 对所有节点,所以 。
- 。
- ?不对,这里要小心:我们是在复制后 基础上加 ,所以 ?但样例第二次查询输出 ,说明我直接这样算不对。
实际上样例中第一次 后,只有一棵树(编号1)被修改,因为初始 ,复制成两棵(编号1和2),只改编号1的树。
编号1的树在 上标记了 个节点(因为标准线段树 的结构中, 区间本身就是一个节点,不会下到 和 去标记,这是标记永久化的特点:在第一个完全包含的节点打标记,不再递归)。所以 (只有节点 被打标记)。
初始 ,,(注意复制前 ,复制后 ,但修改的奇数树数量是 ?这里要仔细)。
为了符合样例,我们修正模型:
设 = 操作前的树的数量。
操作 :
- 复制后树数 。
- 奇数树数量 = 。
- 对每个覆盖的节点 ,新增 的数量 = 奇数树中该节点为 的数量 = (因为 是操作前该节点为 的树的数量,这些树在复制后变成 棵树该节点为 ,均匀分布在奇偶中,所以奇数树中该节点为 的数量 = )。
所以 。
更新 :复制后 ,然后奇数树中该节点为 的 个变为 ,所以:
那么 。
用这个模型验证样例:
初始 。
第一次查询:输出 。
操作 :
- (操作前)。
- (节点 )。
- 。
- 。
- 。
- (操作后)。
第二次查询:输出 ,符合。
操作 :
-
(操作前)。
-
:节点 ?不,线段树 结构: 根 不包含 ,递归: 左 不包含,相交,递归?其实 会覆盖节点 , , ?
实际标记永久化: 与 不包含,递归左右: 左 与 相交,递归: 不交, 包含。 右 包含。 所以覆盖节点:, , ?不对, 不是节点,因为 不包含 ,所以不会标记 ,只会标记 和 两个节点。
所以 。 -
计算 : 对 :,贡献 。 对 :,贡献 。 总 。
-
。
-
更新 : , 。
-
。
第三次查询:输出 ,符合。
十、最终公式
操作 (当前 ):
- 计算覆盖的节点集合 和 。
- $\Delta = \sum_{u \in C} (t - f_u) = t\cdot A - \sum_{u \in C} f_u$。
- 。
- 对每个 :。
- 。
查询 :输出 。
-
- 1
信息
- ID
- 4504
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者