2017种树题解
分析
每棵树的费用为 \(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\times 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\times 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 即求区间和。