CF575B Bribes
CF575B Bribes
Solution
对 “有效边” 统计被反向经过的数量然后等比数列求和。
考虑一条路径 \(s \to t\) 对 "有效边 \(u \to v\) 是否有贡献。
- \(u \to v\) 自叶向根:\(s\) 不在 \(u\) 子树内,\(t\) 在 \(u\) 子树内。
- \(u \to v\) 自根向叶:\(s\) 在 \(u\) 子树内,\(t\) 不在 \(u\) 子树内。
判断在不在子树内可以用 dfs 序。
对每一条 “有效边”,都需要求出给定序列中满足条件的 \((s, t)\) 的数量。
考虑枚举 “有效边”,此时子树区间固定。
考虑将给定序列分成若干有向线段(线段端点位置是 dfs 序)。
具体地:若 \(dfn_{u} < dfn_v\),自根向叶;否则自叶向根。
把正序线段称作一类线段,逆序线段称作二类线段,分别计算。
分类讨论哪些线段会对当前询问产生贡献:
- 自叶向根:询问区间为 \(u\) 子树对应的区间,
- 对于一类线段:左端点在区间左侧,右端点在区间内。
- 对于二类线段:左端点在区间内,右端点在区间右侧。
- 自根向叶:询问区间为 \(v\) 子树对应的区间,
- 对于一类线段:左端点在区间内,右端点在区间右侧。
- 对于二类线段:左端点在区间左侧,右端点在区间内。
需要预处理:
- 以点 \(x\) 为左端点向右延伸的线段数量 \(lc_x\)
- 以点 \(x\) 为右端点向左延伸的线段数量 \(rc_x\)
- 对上面两个量求前缀和数组 \(lsum_x, rsum_x\)
左端点在区间左侧,右端点在区间内的线段数量可以转为 \(rsum_{r} - rsum_{l - 1} - cnt\)。其中 \(l, r\) 是区间端点,\(cnt\) 是完全被包含在区间内的线段数量,而 \(cnt\) 可以用二维数点求出来。
瓶颈在求 \(cnt\),单 \(\log\)。

浙公网安备 33010602011771号