POJ 2299 Ultra-QuickSort

来源:互联网 发布:cydia红包软件源 编辑:程序博客网 时间:2024/06/14 06:28

Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536KTotal Submissions: 52744 Accepted: 19331

Description

In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,

Ultra-QuickSort produces the output
0 1 4 5 9 .

Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

Input

The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

Output

For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

Sample Input

59105431230

Sample Output

60

求逆序数,和 http://blog.csdn.net/sdfgdbvc/article/details/51171769 这题一模一样,可以复习一下


//归并排序 #include <stdio.h>#define MAX 500005int N;int a[MAX], b[MAX];long long sum;void Merge(int start, int mid, int end){int i = start, j = mid + 1, k = start;while(i <= mid && j <= end){if(a[i] <= a[j]){b[k++] = a[i++];}else{sum += j - k;b[k++] = a[j++];}}while(i <= mid){b[k++] = a[i++];}while(j <= end){b[k++] = a[j++];}for(i = start; i <= end; i++)a[i] = b[i]; }void MergeSort(int start, int end){if(end > start){int mid = (start + end) / 2;MergeSort(start, mid);MergeSort(mid+1, end);Merge(start, mid, end);}}int main(){int i;while(scanf("%d", &N) && N){sum = 0;for(i = 0; i < N; i++)scanf("%d", &a[i]);MergeSort(0, N-1);printf("%lld\n", sum);}return 0;}/*//树状数组 #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 500005int N;int tree[MAX], f[MAX];struct P{int v;int num;} pro[MAX];int cmp(const void *a, const void *b){return (*(P*)a).v - (*(P*)b).v;}int lowbit(int x){return x & -x;}void updata(int n, int x){while(n <= N){tree[n] += x;n += lowbit(n);}}int find(int n){int sum = 0;while(n >= 1){sum += tree[n];n -= lowbit(n);}return sum;}int main(){int i;long long sum;while(scanf("%d", &N) != EOF && N){sum = 0;memset(tree, 0, sizeof(tree));for(i = 1; i <= N; i++){scanf("%d", &pro[i].v);pro[i].num = i;}qsort(pro+1, N, sizeof(pro[1]), cmp);int id = 1;f[pro[1].num] = 1;for(i = 2; i <= N; i++){if(pro[i].v == pro[i-1].v)f[pro[i].num] = id;elsef[pro[i].num] = ++id;}for(i = 1; i <= N; i++){updata(f[i], 1);sum += i - find(f[i]);}printf("%lld\n", sum);}return 0;}*/


0 0
原创粉丝点击