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