【线段树】求逆序对
2021-04-11 16:05:00
# ACM
普通线段树是预先处理出值域的范围。像二叉树一样建树,有时通过将所给序列离线离散化以减小普通线段树的值域。
当所给序列不允许离线而且值域比较大时,动态开点线段树可以 $O(nlogm)$ 维护线段树,$m$ 是值域,假象一开始有一颗 $[1,m]$的线段树,当然是不去建它的。
对于普通线段树都有修改操作,则如将 $a[x]$ 加上 $val$,$x$ 对应原数组下标,就去递归这颗 $[1,m]$ 的线段树直到下标 $x$,只有递归过程中碰到未建立的节点就新建节点。
例如求逆序对:
一步步遍历所给序列 $a[x]$,将 $[1,m]$ 的线段树第 $x$ 位上加上 $1$,然后 $push_up$,每一步都求当前 $a[x]$ 前面有几个比 $a[x]$ 大的,相当于求线段树上 $[ a[x]+1,m ]$($m$是值域)的和,递归求解就好。
1 |
|