逆序对

逆序对

所求的交换次数等价于满足\(i<j,a_i>a_j\)\((i,j)\)的数对的个数(这种数对的个数叫做逆序数)。

可以利用树状数组来求解逆序对的问题

// Created by CAD on 2020/2/8.
#include <bits/stdc++.h>
#define lowbit(i) (i&-i)
using namespace std;

const int maxn=1e5+5;
int a[maxn],c[maxn],n;
void add(int x,int k){
    while(x<=n)
        c[x]+=k,x+=lowbit(x);
}
int getsum(int x){
    int ans=0;
    while(x>=1)
        ans+=c[x],x-=lowbit(x);
    return ans;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    int ans=0;
    for(int i=1;i<=n;++i){
        ans+=i-1-getsum(a[i]);
        add(a[i],1);
    }
    cout<<ans<<endl;
}
posted @ 2020-02-09 11:28  caoanda  阅读(139)  评论(0编辑  收藏  举报