树状数组求逆序对

int n;
struct st{
    int v,id;
}a[N];
int tr[N],rk[N];

void add(int x,int k){
    while(x<=n){
        tr[x]+=k;
        x+=lowbit(x);
    }
}

int query(int x){
    int res=0;
    while(x){
        res+=tr[x];
        x-=lowbit(x);
    }
    return res;
}

void solve(){
	cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].v;
        a[i].id=i;
    }
    sort(a+1,a+n+1,[&](st a,st b){return (a.v==b.v)?(a.id<b.id):(a.v<b.v);});
    for(int i=1;i<=n;i++){
        rk[a[i].id]=i;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        add(rk[i],1);
        ans+=(i-query(rk[i]));
    }
    cout<<ans<<endl;
}

posted on 2024-09-10 19:40  TaopiTTT  阅读(1)  评论(0编辑  收藏  举报