题意:给定一个 n 的排列 ai,定义 f(l,r,x) 表示区间 [l,r] 中小于 x 的数的个数。对于每个 i∈[1,n],求出
l=1∑ir=i∑nf(l,r,ai)
n≤2×105。
题解:前两天刚讲过二维数点,今天就用上了。
对于每个 i 拆一下贡献。
- 满足 j<i 且 aj<ai 的 j 能对 i 的答案产生 j×(n−i+1) 的贡献。
- 满足 j>i 且 aj<ai 的 j 能对 i 的答案产生 i×(n−j+1) 的贡献。
现在有了一个 O(n2) 的暴力。
对所有贡献整体考虑,接着拆式子。
- 所有满足 j<i 且 aj<ai 的 j 能对 i 的答案一共产生 (n−i+1)×∑j 的贡献。
- 所有满足 j>i 且 aj<ai 的 j 能对 i 的答案一共产生 x×i(n+1)−i×∑j 的贡献。这里的 x 表示满足条件的 j 的个数。
我们把 (i,ai) 看作二维平面上的一个点,第一种贡献只需要求左下角为 (1,1) 右上角为 (i−1,ai−1) 的矩形中 j 的总和,第二种贡献就是在求左下角为 (i+1,1) 右上角为 (n,ai−1) 的矩形中 j 的总和以及点的个数。
用两个树状数组做二维数点,扫到 (i,ai) 时在一个上加 i 另一个上加 1,套式子就可以求了。
时间复杂度 O(nlogn)。