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

#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

 

posted on 2022-05-15 09:21  我疯故我在  阅读(35)  评论(0)    收藏  举报