java P1908 逆序对

题目描述
猫猫 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];
		}
	}

}
发布了87 篇原创文章 · 获赞 27 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43457125/article/details/105142818