[普及] 求序列中逆序对的个数 [poj 2299 Ultra-QuickSort]

http://poj.org/problem?id=2299 Ultra-QuickSort

模型转化成求一个数列中的逆序数的对数

n <= 500, 000

hint:利用归并排序的merge过程计算 O(nlogn)

代码反选可见

#define N 500010
int num[N], tmp[N];
int n;
long long res;
void mergesort(int fr, int to)
{
	if (to - fr > 1) {
		int mid = (to + fr) / 2;
		mergesort(fr, mid);
		mergesort(mid, to);
		int i = fr, j = mid, k;
		for (k = fr; i < mid && j < to && k < to; k++) {
			if (num[i] > num[j]) {
				res += mid - i;
				tmp[k] = num[j++];
			} else {
				tmp[k] = num[i++];
			}
		}
		if (i == mid) { while (j < to) { tmp[k] = num[j]; j++, k++; } }
		if (j == to) { while (i < mid) { tmp[k] = num[i]; i++, k++; } }
		for (k = fr; k < to; k++) { num[k] = tmp[k]; }
	}
}

int main()
{
	int i, j, k;
	while (1) {
		scanf("%d", &n);
		if (0 == n) {
			break;
		}
		res = 0;
		for (i = 0; i < n; i++) {
			scanf("%d", num + i);
		}
		mergesort(0, n);
		cout << res << endl;
	}
	return 0;
}

posted on 2011-04-01 15:12  schindlerlee  阅读(274)  评论(0编辑  收藏  举报