分析
每棵树的费用为 (cost_i=sum_{k=1}^{i-1} |x_i-x_k|)。
由于 (x_i) 与 (x_k) 的大小关系的存在,我们可以把它分成两部分:
- (sum (x_i-x_k) | x_i >= x_k, 1 le k le i-1)
- (sum (x_k-x_i) | x_i < x_k, 1 le k le i-1)
上面 1 式继续展开:(=sum x_i - sum x_k = cnt_1 imes x_i + sum x_k | x_i >= x_k, 1 le k le i-1)
上面 2 式继续展开:(=sum x_k - sum x_i = sum x_k - cnt_2 imes x_i | x_i < x_k, 1 le k le i-1)
因此,我们只要找出上面的 (cnt_1,cnt_2) 和两个sum即可。
很显然,(cnt_i) 就是不大于 (x_i) 的数的个数,(cnt_2) 类似。
1 式中的 (sum x_k) 是不大于 (x_i) 的所有数的和,2 式中的类似。
所以我们可以建线段树,把 (x_i) 加到 (x_i),求 cnt 和 sum 即求区间和。