Ultra-QuickSort
Time Limit: 7000MS Memory Limit: 65536K
Total Submissions: 60754 Accepted: 22531
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.
题解
其实就是说,一组数,可以两两交换,求这样操作直到顺序排好是的最小操作数。
两种方法:
1、线段树求逆序对。
2、归并排序求逆序对。
(其实还可以是冒泡排序+优化,不过过不完)。
代码
首先是归并排序:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<ctime>
#include<map>
using namespace std;
const int N=500000+10;
long long num[N],temp[N],ans;
int n;
void merge(int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while (i<=mid&&j<=high)
{
if (num[i]<=num[j]) temp[k++]=num[i++];
else
{
ans+=j-k;
temp[k++]=num[j++];
}
}
while (i<=mid) temp[k++]=num[i++];
while (j<=high) temp[k++]=num[j++];
for (i=low;i<=high;i++)
num[i]=temp[i];
}
void mergesort(int a,int b)
{
if (a<b)
{
int mid=(a+b)/2;
mergesort(a,mid);
mergesort(mid+1,b);
merge(a,mid,b);
}
}
int main()
{
while(scanf("%d",&n)!=EOF&&n>0)
{
ans=0;
for (int i=0;i<n;i++)
scanf("%lld",&num[i]);
mergesort(0,n-1);
printf("%lld\n",ans);
}
return 0;
}