启发式合并.
对每个连通块,用一个 vector 维护块内所有点的编号,用一个可删堆维护块内所有权值,维护一个块加法标记 $tag$ .
用一个可删堆维护每个块的最大值中的最大值,维护一个全局加法标记 $Stag$ .
合并时直接用启发式合并,修改时先将对应的贡献在对应的可删堆中删掉,修改后再加回去.
时间复杂度 $O(n\log^2 n)$ ,但常数小,跑得还挺快的.
这样就可以搞到 Loj 上的代码最短了.
1 | //%std |
夢はここに 思い出は遠くに
启发式合并.
对每个连通块,用一个 vector 维护块内所有点的编号,用一个可删堆维护块内所有权值,维护一个块加法标记 $tag$ .
用一个可删堆维护每个块的最大值中的最大值,维护一个全局加法标记 $Stag$ .
合并时直接用启发式合并,修改时先将对应的贡献在对应的可删堆中删掉,修改后再加回去.
时间复杂度 $O(n\log^2 n)$ ,但常数小,跑得还挺快的.
这样就可以搞到 Loj 上的代码最短了.
1 | //%std |