因为感觉网上的都怪怪的,所以自己yy了一下。。
假设树上点数是 O ( n ) O(n) O(n),每个点上有一些权值。每个点的权值个数之和是 O ( m ) O(m) O(m),线段树是对权值建的。
考虑一个线段树上的区间
[
l
,
r
]
[l,r]
[l,r]
在合并的时候,只有当两个线段树在这个区间内都有点,这个区间才会贡献 1 的复杂度。
而考虑这个区间内的权值在原树上的分布,假设原树上共有
k
k
k个点含有这个区间内的权值,容易发现最多有
k
−
1
k-1
k−1次合并在两棵线段树会同时存在这个区间内的权值。(因为是树形合并)。那么这个区间总共会贡献
O
(
k
)
O(k)
O(k)的复杂度。
然后考虑在线段树中同一层的所有区间,它们对复杂度的贡献是
O
(
∑
某
个
区
间
树
上
包
含
这
个
区
间
内
的
权
值
的
点
数
)
O(\sum_{某个区间} 树上包含这个区间内的权值的点数)
O(∑某个区间树上包含这个区间内的权值的点数)
≤
O
(
∑
某
个
权
值
树
上
包
含
这
个
权
值
的
点
数
)
=
O
(
m
)
\le O(\sum_{某个权值}树上包含这个权值的点数)=O(m)
≤O(∑某个权值树上包含这个权值的点数)=O(m)
而线段树总共有 log m \log m logm层,所以复杂度是小于 O ( m log m ) O(m\log m) O(mlogm)的。
而在一般的问题中,每个点通常只包含一个权值并且互不相同( m = n m=n m=n),所以 O ( ∑ 某 个 区 间 树 上 包 含 这 个 区 间 内 的 权 值 的 点 数 ) = O ( ∑ 某 个 区 间 区 间 大 小 ) = O ( n ) O(\sum_{某个区间}树上包含这个区间内的权值的点数)=O(\sum_{某个区间}区间大小)=O(n) O(∑某个区间树上包含这个区间内的权值的点数)=O(∑某个区间区间大小)=O(n),于是复杂度为 O ( n log n ) O(n\log n) O(nlogn)
由此也可以见得,如果每个点都有 O ( n ) O(n) O(n)个权值,那么复杂度将会是 O ( n 2 + n 2 2 + n 2 4 + n 2 n ) = O ( n 2 ) O(n^2+\frac {n^2}2+\frac {n^2}4+\frac {n^2}n)=O(n^2) O(n2+2n2+4n2+nn2)=O(n2)