首页 > 编程语言 > 详细

树状数组+离散化求逆序对

时间:2019-11-13 09:21:28      阅读:107      评论:0      收藏:0      [点我收藏+]
#include<cstdio>
#include<algorithm>
typedef long long LL;

int n,tot0,a[500005],b[500005];

LL ans;

struct BIT{
    int c[500005];
    inline int lowbit(int x){return x&(-x);}
    inline void add(int k,int x){
        while(k<=n){
            c[k]+=x;
            k+=lowbit(k);
        }
    }
    inline int query(int k){
        int fuck=0;
        while(k){
            fuck+=c[k];
            k-=lowbit(k);
        }
        return fuck;
    }
}T;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    std::sort(b+1,b+n+1);
    for(int i=1;i<=n;i++){
        a[i]=std::lower_bound(b+1,b+n+1,a[i])-b;
    }
    for(int i=n;i>=1;i--){
        if(a[i]==1){
            ans+=tot0;
            T.add(a[i],1);
        }
        else if(a[i]==0){
            tot0++;
        }
        else{
            ans+=T.query(a[i]-1);
            T.add(a[i],1);
        }
    }
    printf("%lld\n",ans);
}

求的是1≤n≤5×10^5,0≤a[i]≤10^9。

如果a[i]小于等于0的话其实可以全局加上某一个数字,变成正的,要不然szsz干不了他

像我这样智商不够归并排序的蒟蒻只能靠数据结构来凑啦

树状数组+离散化求逆序对

原文:https://www.cnblogs.com/Y15BeTa/p/11846593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!