因爲感覺網上的都怪怪的,所以自己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)