树状数组求逆序对数

#include
#include
#include
#include
#include
using namespace std;
#define ll long long
const int maxn=100000;
ll a[maxn+10],sum[maxn+10],N;
void add(ll x)
{
    while(x<=maxn){
        sum[x]++;
        x+=(-x)&x;
    }
}
ll query(ll x){
    ll res=0;
    while(x){
        res+=sum[x];
        x-=(-x)&x;
    } return res;
}
int main()
{
    ll i, ans=0;
    scanf("%lld",&N);
    for(i=1;i<=N;i++) scanf("%lld",&a[i]),a[i]++;
    for(i=N;i>=1;i--){
        ans+=query(a[i]-1);
        add(a[i]);
    }
    printf("%lld\n",ans);
    return 0;
}

你可能感兴趣的:(线段树与树状数组)