树状数组 求逆序对个数 Java

排序:①数值大的先加入树状数组,后加入的发现前面有比自己大的,那么答案+1

        ②如果数值相同,编号大的优先做(仔细一想还真是)

import java.util.*;
import java.io.*;

//求逆序对个数
public class Main {
	static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st=new StreamTokenizer(br);
	static int nextInt() throws Exception {
		st.nextToken();
		return (int)st.nval;
	}
	static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
	static int n;
	static node45 a[];
	static long tree[];
	static int lowbit(int x) {
		return x&(-x);
	}
	
	static void update(int index,long val) {
		for(int i=index;i<=n;i+=lowbit(i)) {
			tree[i]+=val;
		}
	}
	static long query(int index) {
		long res=0;
		for(int i=index;i>=1;i-=lowbit(i)) {
			res+=tree[i];
		}
		return res;
	}
	
	
	public static void main(String []args) throws Exception {
		n=nextInt();
		a=new node45[n+1];
		long ans=0;
		int b[]=new int[n+1];
		int cnt=1;
		for(int i=1;i<=n;i++) {
			int c=nextInt();
			a[i]=new node45();
			a[i].val=c;
			a[i].index=i;
		}
		tree=new long[n+1];
		Arrays.sort(a,1,n+1, new Comparator<node45>() {
			public int compare(node45 e1,node45 e2) {
				if(e1.val==e2.val) {
					return e2.index-e1.index;
				}
				return e2.val-e1.val;
			}
		});
		for(int i=1;i<=n;i++) {
			update(a[i].index,1);
			ans+=query(a[i].index-1);//不包括自己,前面有多少数,就有多少个逆序对
		}
		pw.print(ans);
		pw.flush();
	}
}
class node45{
	public int val;
	public int index;
	  public node45(int val, int num) {
          this.val = val;
          this.index = num;
      }
	public node45() {
		// TODO Auto-generated constructor stub
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值