区间本质不同逆序对,要求线性空间。
O ( n n × n ) \mathcal O(n \sqrt n \times \sqrt n) O(nn×n) 应该谁都会做,而且谁都知道不能过。
回顾 P5047
,考虑莫队二次离线。
记 f ( l , r ) f(l,r) f(l,r) 为 [ l , r ] [l,r] [l,r] 中 > a r >a_r >ar 的数的种类数。
则区间转移从 [ l , r − 1 ] [l,r-1] [l,r−1] 变成 [ l , r ] [l,r] [l,r],令 r ′ r' r′ 为 a r a_r ar 上一次出现的位置,则贡献为 f ( l , r ) − f ( l , r ′ ) f(l,r)-f(l,r') f(l,r)−f(l,r′),其他方向和一连段转移同理。
考虑到种类数难以维护,尝试通过扫描线转换为总数,问题转化为查询区间内比一个数小的数的个数,需要 O ( n ) \mathcal O(n) O(n) 次单点修改, O ( n n ) \mathcal O(n \sqrt n) O(nn) 次矩阵和查询,第一维是下标,第二维是值域,此时点的横坐标和纵坐标一一对应,即横坐标和纵坐标两两不同。
我们需要一个针对上述问题的 O ( n ) − O ( 1 ) \mathcal O(\sqrt n)-\mathcal O(1) O(n)−O(1) 数据结构。
引入二维分块,即对 n × n n\times n n×n 的矩阵进行适当地分块,使得块数 O ( n ) \mathcal O(\sqrt n) O(n) 且支持 O ( n ) − O ( 1 ) \mathcal O(\sqrt n)-\mathcal O(1) O(n)−O(1) 或 O ( 1 ) − O ( n ) \mathcal O(1)-\mathcal O(\sqrt n) O(1)−O(n)。
首先用将整个矩形用 n 0.75 × n 0.75 n^{0.75}\times n^{0.75} n0.75×n0.75 来分块(如图红色部分),这样总块数为 O ( n 0.25 × n 0.25 = n ) \mathcal O(n^{0.25}\times n^{0.25}=\sqrt n) O(n0.25×n0.25=n) 的,整块复杂度保证。
考虑分剩余块,使得较小块复杂度保证,不证:
- n 0.25 × n 0.25 n^{0.25}\times n^{0.25} n0.25×n0.25 个 n 0.75 × n 0.5 n^{0.75}\times n^{0.5} n0.75×n0.5 大小的块,蓝色部分。
- n 0.25 × n 0.25 n^{0.25}\times n^{0.25} n0.25×n0.25 个 n 0.5 × n 0.76 n^{0.5}\times n^{0.76} n0.5×n0.76 大小的块,绿色部分。
- n 0.25 × n 0.25 n^{0.25}\times n^{0.25} n0.25×n0.25 个 n 0.5 × n 0.5 n^{0.5}\times n^{0.5} n0.5×n0.5 大小的块,橙色部分。
如图,例: 155 155 155。
[外链图片转存中…(img-LKhH8CdI-1655162111518)]
最后考虑灰色块复杂度,由于询问横坐标和纵坐标两两不同,而灰色块宽度不超过 O ( n ) \mathcal O(\sqrt n) O(n),涉及的询问只有 O ( n ) \mathcal O(\sqrt n) O(n) 种,故散块修改 O ( n ) \mathcal O(\sqrt n) O(n),查询 O ( 1 ) \mathcal O(1) O(1),复杂度保证。
时间复杂度为 O ( n n ) \mathcal O(n\sqrt n) O(nn),空间复杂度为 O ( n ) \mathcal O(n) O(n)。