Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
inversion_number.hpp
[詳解]
1#include "../../kyopro_library/template.hpp"
2
3/// @brief 転倒数
4/// @brief 配列 v の転倒数を求める
5/// @note O(N log(N))
6ll 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}
ll InversionNumber(const vector< int > &v)
転倒数