树状数组模板(Java版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/westbrook1998/article/details/83117644

hiho1524
树状数组求逆序对

import java.util.Scanner;

public class Main {
    public static final int N=100050;
    public static int n,x;
    public static long ans;
    public static int[] c=new int[N];

    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        n=cin.nextInt();
        for(int i=1;i<=n;i++){
            x=cin.nextInt();
            add(x,1);
            ans+=(i-sum(x));
        }
        System.out.println(ans);
    }

    public static int lowbit(int x){
        return x&(-x);
    }
    public static void add(int x,int d){
        while(x<=n){
            c[x]+=d;
            x+=lowbit(x);
        }
    }
    public static int sum(int x){
        int res=0;
        while(x>0){
            res+=c[x];
            x-=lowbit(x);
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/westbrook1998/article/details/83117644