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
ll ret=0;
8
auto
Merge=[&](
const
vector<
int
>& a,
const
vector<
int
>& b) {
9
int
n=a.size();
10
int
r=0;
11
for
(
int
l=0; l<n; l++) {
12
while
(r<n&&b[r]<a[l]) r++;
13
ret+=r;
14
}
15
vector<
int
> c(2*n);
16
merge(a.begin(),a.end(),b.begin(),b.end(),c.begin());
17
return
c;
18
};
19
20
int
n=v.size(),n2=1;
21
while
(n2<n) n2<<=1;
22
vector<vector<
int
>> node(n2<<1,vector<
int
>(1,INF));
23
for
(
int
i=0; i<n; i++) node[i+n2][0]=v[i];
24
for
(
int
i=n2-1; i>0; i--) node[i]=Merge(node[i<<1],node[i<<1|1]);
25
return
ret;
26
}
InversionNumber
ll InversionNumber(const vector< int > &v)
転倒数
Definition
inversion_number.hpp:6
algorithm
inversion_number.hpp
構築:
1.13.2