[普及] 求序列中逆序对的个数 [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) 编辑 收藏 举报