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 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}
ll InversionNumber(const vector< int > &v)
転倒数