LiWenX 在模拟赛中见到了此题,看题后想到了用暴力地线段树合并来解决问题,具体是这样的。
对于每个副部长,都可以为他建一颗线段树,把点两两间的路径做线段树覆盖。m 次操作后,merge 所有的线段树,然后把节点上的覆盖标记加上来,最后把所有节点pushdown 即可。
非常好的想法,几乎不用动脑子就 A 了!
考场中过完样例的 LiWenX 这样想到。
可是结果是这种做法仅有 36 分,WA 了许多点。
下载数据后发现输出答案大于标准答案,这是为什么呢。
可以发现,在 cover 的过程中,有的节点被覆盖了多次(这也是选择 cover 而不是加法的原因)。而可能会出现先覆盖下面的节点,再覆盖上面的父节点,倒置一个叶子的祖先上有多于一个的 cover 标记。而最后 pushdown 把标记加法下穿时,会出现重复覆盖的问题。
那么如何解决,LiWenX 马上想到把修改区间长度从大到小排序再一个一个执行。
但 lfxxx 打断了他,他说可以在一次打标记的同时,删除左右儿子,这样显然可行!虽然有点费内存,但复杂度没有改变,修改完代码后果然 AC 了。
后记
本帖希望可以帮助更多在学习线段树合并的人与对本题线段树合并做法有疑惑的人。
同时感谢 @lfxxx 对我的帮助。