社区讨论

线段树合并求 hack

学术版参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@miiuejef
此快照首次捕获于
2025/11/28 20:32
3 个月前
此快照最后确认于
2025/11/29 17:25
3 个月前
查看原帖
假设现在有 nn 棵线段树,每个线段树上只有一个区间修改,并且需要下放标记。然后要把它们合并成一棵线段树。(需要维护的操作有区间加区间chkmin,需要维护的信息是区间min,合并两个线段树形如对位相加。)
这个东西的朴素做法就是 PushDown 时新建节点,但这显然能被卡成 O(n2)O(n^2)(假设线段树维护的下标也是 1n1\sim n)。例如,当我们合并两个只有根节点有标记的线段树时,它们都会被扩展成全树。
于是我胡了一种神秘做法:假设现在合并 u,vu,v,并且 uu 没有儿子,那么 uu 的值全部相同,想要把它对位相加就不需要再下放标记/递归了。于是可以直接合并。
写的时候想了一下,感觉是 O(nlogn)O(n\log n) 的。(因为往新节点的递归次数是 O(1)O(1) 的。)但今天突然又感觉不太对。求 hack。

回复

5 条回复,欢迎继续交流。

正在加载回复...