闲扯
这道题挺妙的。
题面
Solution
这道题直接模拟肯定是不行的,我们考虑换个思路。
我们统计对于每一个 $a_i$ ,它被计算了几次。
排序后,假如 $a_i$ 处于第 $k$ 个,那么它就会被多算 $k-1$ 次。那么相当于在这个区间中每一个比 $a_i$ 小的数都会使 $a_i$ 多算一次。
那么我们只需要统计每一个比 $a_i$ 小的数能在多少个区间里面被包含即可。
- 若 $a_j<a_i,j<i$ ,则同时包含 $a_i,a_j$ 的区间有 $j\cdot (n-i+1)$ 个,那么 $a_i$ 就会被多算 $j\cdot (n-i+1)$ 次。
- 若 $a_j
i$ ,则同时包含 $a_i,a_j$ 的区间有 $i\cdot(n-j+1)$ 个,那么 $a_i$ 就会被多算 $i\cdot(n-j+1)$ 次。
我们按照权值大小对 $a$ 数组排序,然后依次插入,统计两种情况的答案即可。
对于权值相等的,插入顺序是不会影响答案的,简单推一下即可。
Code
1 |
|
总结
要抓住问题的本质,善于将问题转换成容易求解的形式。