一个经典问题的另解

先说结论,区间逆序对可以简单的转换为行加列和。

\[\sum_{l \leq i < j \leq r}[a_i>a_j]=\sum_{i<j}[a_i<a_j]-\sum_{i < l} \sum_{i < j}[a_i>a_j]-\sum_{j>r} \sum_{i<j} [a_i>a_j]-\sum_{i<l<r<j}[a_i>a_j] \]

只有最后一个是非平凡的,考虑如下办法计算:我们对 \(r\) 从大到小扫描线,每次加入一个可能的 \(j\) 然后考虑其与 \(i\) 的相互作用,不妨将 \(j\) 看成让所有 \(a_i>a_j\) 的 \(i\) 的权值加 \(1\),那么查询就是问 \(i<l\) 的所有 \(i\) 的权值和,这是一个经典的行加列和问题,可以使用分块直接维护做到 \(O(n \sqrt n)\),同时容易知道空间是线性的。

行加列和问题的做法:离散化坐标保证每个点的横纵坐标均为排列(本题给出的数据已经满足了这件事),对行列各分为 \(\sqrt n\) 块,把行加拆成整块加和散点加,把列和拆成整块前缀和与单点和,维护行整块加对列整块前缀和的贡献系数,行单点加对列整块的贡献系数,行整块加对列散点和的贡献系数即可。

posted @ 2026-10-10 11:11  Ch1F4N  阅读(7)  评论(0)    收藏  举报