去重复计算的 trick
重算与抵消:处理去重贡献的技巧
很多问题的难点在于:目标状态具有“去重”性质,例如集合大小、区间不同元素数、路径不同颜色数等。
直接维护真实状态通常很困难,因为一个元素是否产生贡献,取决于它之前是否出现过。
一种常见的转化方法是:
不直接维护真实状态,而是维护一个容易计算的状态,再通过抵消操作消除多余贡献。
具体来说:
- 每次出现一个元素,先认为它产生贡献;
- 如果发现这个元素已经出现过,则说明产生了重复贡献,只需找到重复来源并撤销多算的部分。
这种方法的关键在于:
错误必须是可控的。
如果每次重复都需要重新扫描整个状态,复杂度仍然会爆炸;而优秀的设计要求:
- 每个元素只产生有限次贡献;
- 每次多算都能通过局部操作修正;
- 修正范围可以被数据结构高效维护。
因此,虽然中间状态可能不是最终答案,但总修改次数仍然可控,最终复杂度不会增加。
本质上,这是一种“先简单计算,再局部修正”的思想:
允许暂时多算,但必须保证所有多算的部分都能被快速消除。
常用于:
- 不同元素统计;
- 树上颜色贡献;
- 扫描线;
- 区间覆盖;
- 各类集合大小维护问题。

浙公网安备 33010602011771号