其他分享
首页 > 其他分享> > 树状数组与逆序对

树状数组与逆序对

作者:互联网

当数据范围较大需要离散化,因此需要排序,所以这种情况下不如直接用归并排序。

#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int n;
int a[N],b[N];
int c[N];

int ask(int x) {
    int ans=0;
    for(; x; x-=x&-x) ans+=c[x];
    return ans;
}

void add(int x,int y) {
    for(; x<=n; x+=x&-x) c[x]+=y;
}

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(a+1,a+1+n);
    int k=unique(a+1,a+n+1)-a-1;
    for(int i=1; i<=n; i++) b[i]=lower_bound(a+1,a+1+k,b[i])-a;
    long long ans=0;
    for(int i=n; i>=1; i--) {
        ans+=ask(b[i]-1);
        add(b[i],1);
    }
    printf("%lld\n",ans);
    return 0;
}
View Code

 

标签:return,树状,int,add,数组,ans,ask,排序,逆序
来源: https://www.cnblogs.com/9r2pqvv88/p/16272355.html