rt,一开始预处理逆序对个数,后面每次询问 O(n)O(n)O(n) 修订答案即可,感觉完全不用分块和树套树啊,太水了这题,建议要么卡掉暴力要么降绿。
核心代码:
if (a > b) // 一大槽点,数据没有保证 a < b,如果反了要自己换回来 swap(a, b); // a 为前面的位置,b 为后面的位置 for (int i = a; i <= b - 1; i++) // Δans = 交换后a到b-1中比交换前的h[a]大的数的个数 - 交换前a到b-1中比交换前h[b]大的数的个数 + // a+1到b-1中比h[b]小的个数 - a+1到b-1中比h[a]小的个数 { ans += h[i] > h[a]; ans -= h[i] > h[b]; ans += (h[b] > h[i]) - (h[a] > h[i]); // 当 i=a 时算的就是 h[b]>h[a] }