神仙啊,完全想不到……
又学了种套路(
有一个神奇的思路:对于每种颜色,维护所有被泼过此颜色的子树,但是若子树之间有包含关系则保留最大的。
查询时应考虑祖先中是否泼过,以及子树内是否泼过。
可以对每个颜色开一个 set,并用两只 BIT 来维护答案:第一只维护祖先的,第二只维护子树的。
修改时,首先看父亲中有没有泼过同颜色的,如果有则忽略此次操作。
然后看子树内有没有泼过同颜色的,如果有则撤销贡献。
最后在 BIT 上增加这个修改的贡献:在第一只 BIT 中对子树全部加一,在第二只 BIT 中对该点加上子树大小。
则查询时的答案为第一只 BIT 中该点的贡献乘上子树大小与第二只 BIT 中的子树和之和。
不过可能会重复计算,可以在统计第二只 BIT 中贡献时忽略该点,让第一只 BIT 去统计。
代码:
1 |
|