专栏文章

题解:[ABC396F] Rotated Inversions

AT_abc396_f题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipyeir6
此快照首次捕获于
2025/12/03 19:58
3 个月前
此快照最后确认于
2025/12/03 19:58
3 个月前
查看原文
本文遵循 CC BY-NC-ND 4.0 协议,作者:U•ェ•*U,转载请获得作者授权。
先求 k=0k=0 时的逆序数:用树状数组在 O(NlogM)O(N\log M) 时间内统计标准逆序数。
分析 kk+1k\to k+1 时逆序数的变化: 观察每个位置 ii ,当 kk 增加 11 时,Bi=(Ai+k)modMB_i = (A_i+k)\mod M 只有在等于模数(即 Ai+k=M1A_i+k = M-1)时变为 00,就改变了它在序列中的相对大小。可以证明,当某个位置 ii 满足 k=M1Aik = M-1-A_i 时,该位置会改变贡献,对全局逆序数的影响为
(在该位置前的个数)(在该位置后的个数)=2i(N1)( \text{在该位置前的个数} ) - ( \text{在该位置后的个数} ) = 2\cdot i - (N-1)
因此可以令一个差分数组 diffdiff(下标范围 [0,M1][0,M-1])满足:对于每个位置 ii,在 k=M1Aik = M-1-A_i 时,加上 2i(N1)2\cdot i-(N-1)
最后,对于每个 kk,我们加上 diffkdiff_k 即可。
PYTHON
import sys

n, m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
tree = [0] * (200010)
diff = [0] * (200010)

def add(x, val):
    x += 1
    while x <= m:
        tree[x] += val
        x += (x & -x)

def query(x):
    x += 1
    res = 0
    while x:
        res += tree[x]
        x -= (x & -x)
    return res

def main():
    tmp = 0
    for i in range(n):
        tmp += i - query(a[i])
        add(a[i], 1)
        diff[m - 1 - a[i]] += (2 * i - (n - 1))

    print(tmp)
    for k in range(1, m):
        tmp += diff[k - 1]
        print(tmp)

if __name__ == '__main__':
    main()

评论

0 条评论,欢迎与作者交流。

正在加载评论...