题目描述
猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。
最近,TOM 老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中 ai>aj
且 i<j 的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。
Update:数据已加强。
输入格式
第一行,一个数 n,表示序列中有 n个数。
第二行 n 个数,表示给定的序列。序列中每个数字不超过 10^9。
输出格式
输出序列中逆序对的数目。
输入输出样例
输入 #1
6
5 4 2 6 3 1
输出 #1
11
import java.util.*;
public class Main {
public static void main(String[] args) {
new Main().handleInput();
}
int n = 0;
int[] a = new int[500005];
int[] c = new int[500005];
long s = 0;
public void handleInput() {
Scanner in = new Scanner(System.in);
n = in.nextInt();
for (int i = 1; i <= n; i++) {
a[i] = in.nextInt();
}
msort(1, n);
System.out.println(s);
/*
for(int i = 1; i <= n; i++) {
System.out.println(a[i]); // 输出从小到大排序后的数组
}
}
public void msort(int start, int end) {
if (start == end) {
return;
}
int mid = (start + end ) / 2;
msort(start, mid);
msort(mid+1, end);
int i = start, k = start, j = mid + 1;
while (i <= mid && j <= end) {
if (a[i] < a[j]) {
c[k++] = a[i++];
} else {
c[k++] = a[j++];
s+= mid - i + 1;
}
}
while (i <= mid) {
c[k++] = a[i++] ;
}
while(j <= end) {
c[k++] = a[j++];
}
for (int l = 1; l <= end; l++) {
a[l] = c[l];
}
}
}