class Solution {
public:
typedef long long LL;
// // 1
// // Merge_Sort
// LL ans;
// template<class Array> void count(int left,int right,Array& A,Array& B){
// if(left>=right) return;
// // cout<<"("<<left<<","<<right<<")"<<endl;
// int mid=right+left>>1;//优先级的坑+1: p(+)>p(>>)
// count(left,mid,A,B); count(mid+1,right,A,B);
// int i=left,j=mid+1,k=left;
// while(i<=mid || j<=right){
// if(j>right || (i<=mid && A[i]<=A[j]))
// B[k++]=A[i++];
// else B[k++]=A[j++],ans+= mid-i+1;
// }
// for(int i=left;i<=right;i++) A[i]=B[i];
// }
// inline void init(){ans=0;}
// int reversePairs(vector<int>& nums) {
// init();
// vector<int> empty; empty.resize(nums.size());
// count(0,nums.size()-1,nums,empty);
// return ans;
// }
// // 2
// Binary Indexed Tree(B.I.T)
// 逆序对定义 Σ[i](1,n,Σ[j](1,i-1,A[j]>A[i]))
// 前(后)面有几个比我大(小)之和
// 不断地插入,查询 `我的位置-【 前面有几个比我“小”之和】`
struct node{
int idx,val;
node(){};
node(int idx,int val):idx(idx),val(val){}
bool operator<(node b){
// 忘了考虑val相等地情况 还有 sort的随机性
// 突然想念merge_sort的好
if(val!=b.val)
return val<b.val;
return idx<b.idx;
}
};
inline int lowbit(int x){return x&(-x);}
template<class Array>
inline void update(int x,int n,Array& A){
while(x<=n){
#ifdef DEBUG
cout<<"+"<<x-1<<endl;
#endif
A[x-1]+=1;
x+=lowbit(x);
}
}
template<class Array>
inline int query(int x,Array& A){
int res=0;
while(x){
#ifdef DEBUG
cout<<"="<<x-1<<endl;
#endif
res+=A[x-1];
x-=lowbit(x);
}
return res;
}
int reversePairs(vector<int>& nums) {
LL ans=0;
vector<node> sorted_nums;
vector<int> discrete,tree;
discrete.resize(nums.size());
tree.resize(nums.size());
for(int i=0;i<nums.size();i++)
sorted_nums.push_back(node(i,nums[i]));
sort(sorted_nums.begin(),sorted_nums.end());
#ifdef DEBUG
for(auto x: sorted_nums) cout<<x.idx<<" "<<x.val<<endl;
#endif
// 离散化
for(int i=0;i<sorted_nums.size();i++)
discrete[sorted_nums[i].idx]=i+1;
for(int i=0;i<discrete.size();i++){
update(discrete[i],tree.size(),tree);
ans+=i+1-query(discrete[i],tree);
}
return ans;
}
};
本文章使用limfx的vsocde插件快速发布