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