树状数组的思想,不过会受到N的影响,扩展离散+树状数组(树状数组相关内容参考http://blog.csdn.net/shahdza/article/details/6314818)
//题目描述
//在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
#include<iostream>
#include<vector>
using namespace std;
const int N=100005;
class Solution {
public:
int InversePairs(vector<int> data) {
int n=data.size();
if(n==0)return 0;
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=i-getSum(data[i-1])-1;
update(data[i-1],1);
}
return cnt;
}
private:
int lowbit(int x){
return x&(-x);
}
void update(int x,int val){
while(x<N){
d[x]+=val;
x+=lowbit(x);
}
}
int getSum(int n){
int s=0;
while(n){
s+=d[n];
n-=lowbit(n);
}
return s;
}
private:
int d[N]={0};
};
int main(){
Solution test=Solution();
vector<int>v;
int n;
cin>>n;
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
v.push_back(tmp);
}
cout<<test.InversePairs(v)<<endl;
return 0;
}