struct BIT {
VI data;
BIT(ll sz) {
data.assign(++sz, 0);
}
ll sum(ll k) {
ll ret = 0;
for(++k; k > 0; k -= k & -k) ret += data[k];
return (ret);
}
ll range_sum(ll i, ll j){
if(i==0){
return sum(j);
}else{
return sum(j) - sum(i-1);
}
}
void add(ll k, ll x) {
for(++k; k < SZ(data); k += k & -k) data[k] += x;
}
};
ll inversion_number(VI A){
ll N = A.size();
auto bit = BIT(N);
ll cnt = 0;
FOR(i, 0, N){
ll a = A[i];
assert(a<N);
assert(a>=0);
ll num = i - bit.sum(a);
cnt += num;
bit.add(a, 1);
}
return cnt;
}
転倒数とは?
- 順序関係が逆転しているペアの個数(鉄則本p428)または、
- バブルソートする場合の最小交換回数
- バブルソートで使える操作:"隣接"のswap
- バブルソートの計算量:O(N2)
- なので(順列に限らず)一般の数列に対して決まる数
verified
- No.1115 二つの数列 / Two Sequences
- Cubes Sorting
- C - Swaps 2
図示
転倒数・亜種