Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
inversion_number.hpp
[詳解]
1
#
include
"../../kyopro_library/template.hpp"
2
3
/// @brief 転倒数
4
/// @brief 配列 v の転倒数を求める
5
/// @note O(N log(N))
6
ll
InversionNumber
(
const
vector<
int
>& v) {
7
//座圧する必要がない代わりに空間がΘ(N log(N)) どっちがいいんだろうね
8
ll ret=0;
9
auto
Merge=[&](
const
vector<
int
>& a,
const
vector<
int
>& b) {
10
int
n=a.size();
11
int
r=0;
12
for
(
int
l=0; l<n; l++) {
13
while
(r<n && b[r]<a[l]) r++;
14
ret+=r;
15
}
16
vector<
int
> c(2*n);
17
merge(a.begin(),a.end(),b.begin(),b.end(),c.begin());
18
return
c;
19
};
20
21
int
n=v.size(),n2=1;
22
while
(n2<n) n2<<=1;
23
vector<vector<
int
>> node(n2<<1,vector<
int
>(1,INF));
24
for
(
int
i=0; i<n; i++) node[i+n2][0]=v[i];
25
for
(
int
i=n2-1; i>0; i--) node[i]=Merge(node[i<<1],node[i<<1|1]);
26
return
ret;
27
}
InversionNumber
ll InversionNumber(const vector< int > &v)
転倒数
Definition
inversion_number.hpp:6
algorithm
inversion_number.hpp
構築:
1.13.2