Ultra-QuickSort
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 41406 | Accepted: 15008 |
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.
Ultra-QuickSort produces the output
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
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
题意为计算冒泡排序交换的次数,可看作求逆序对的数量。(相似例题HDU4911)
一般而言,求逆序对有两种方法,归并排序求逆序对,离散化+树状数组求逆序对。这里使用归并排序。
注意数据规模,否则会RE。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <ctime>
using namespace std;
typedef long long LL;
LL num[500001];
LL b[500001];
LL sum = 0;
void merge(int l,int mid,int r){
for(int i = l;i<=r;i++){
b[i] = num[i];
}
int i = l;
int j = mid+1;
int k = l;
while(i<=mid && j<=r){
if(b[i]<=b[j]){
num[k++] = b[i++];
}else{
num[k++] = b[j++];
sum = sum + mid -i+1;
}
// for(i = 0; i < k; i++)
// b[l + i] = num[i];
//
// }
}
while(i<=mid){
num[k++] = b[i++];
}
while(j<=r){
num[k++] = b[j++];
}
}
void msort(int l,int r){
if(l<r){
int mid = (l+r)>>1;
msort(l,mid);
msort(mid+1,r);
merge(l,mid,r);
}
}
int main() {
LL n,k;
while(scanf("%I64d",&n)!=EOF){
if(n == 0)break;
sum = 0;
int i = 0;
for(i = 0;i<n;i++){
scanf("%I64d",&num[i]);
}
msort(0,n-1);
// if(sum >= k){
// sum = sum - k;
// }else{
// sum = 0;
// }
printf("%I64d\n",sum);
}
return 0;
}