您的位置:首页 > 产品设计 > UI/UE

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

2011-04-01 15:12 344 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: