This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub mugen1337/procon
#include "DP/InversionNumber.hpp"
転倒数を返す 中でBinary Indexed Treeの処理をしている
配列の長さをNとしたとき,O(N logN)
template<typename T> long long InversionNumber(vector<T> v){ vector<T> ord=v; sort(begin(ord),end(ord)); ord.erase(unique(begin(ord),end(ord)),end(ord)); vector<long long> bit(ord.size()+1,0); long long ret=0; for(int i=0;i<(int)v.size();i++){ int p=lower_bound(begin(ord),end(ord),v[i])-begin(ord)+1; for(int j=p;j;j-=(j&-j)) ret-=bit[j]; for(int j=p;j<=(int)ord.size();j+=(j&-j)) bit[j]+=1; ret+=i; } return ret; }
#line 1 "DP/InversionNumber.hpp" template<typename T> long long InversionNumber(vector<T> v){ vector<T> ord=v; sort(begin(ord),end(ord)); ord.erase(unique(begin(ord),end(ord)),end(ord)); vector<long long> bit(ord.size()+1,0); long long ret=0; for(int i=0;i<(int)v.size();i++){ int p=lower_bound(begin(ord),end(ord),v[i])-begin(ord)+1; for(int j=p;j;j-=(j&-j)) ret-=bit[j]; for(int j=p;j<=(int)ord.size();j+=(j&-j)) bit[j]+=1; ret+=i; } return ret; }