这道题目的大意 是求 冒泡排序的交换次数
但是 若这道题目 用冒泡排序做的话,肯定会超时 。O(n^2);
但这道题目可以转换为求 逆序数 的大小。(线性代数里面学过的)
9 1 0 5 4
逆序数=4+1+0+1=6 这正是 答案。
我们可以使用 merge_sort() 来求 逆序数 。O(nlogn)
要注意 用int 型的话 ,会wa 的,要用long long
如果用的是cpp 的话 , 不要用cin 要用 scanf 。 后者比前者快了 1000ms 左右
memory time
7266k 391ms
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
long long a[500010];
long long c[500010];
long long ans,cnt;
void merge(int s1,int e1,int s2,int e2)
{
int p=0,p1=s1,p2=s2;
while(p1<=e1&&p2<=e2)
{
if(a[p1]<a[p2])
{
c[p++]=a[p1++];
}
else
{
c[p++]=a[p2++];
ans+=e1-p1+1;
}
}
while(p1<=e1)
c[p++]=a[p1++];
while(p2<=e2)
c[p++]=a[p2++];
for(int i=s1;i<=e2;i++)
a[i]=c[i-s1];
}
void merge_sort(int s,int e)
{
if(s<e)
{
int m=(s+e)/2;
merge_sort(s,m);
merge_sort(m+1,e);
merge(s,m,m+1,e);
}
}
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i] );
ans=0;
merge_sort(0,n-1);
cout<<ans<<endl;
}
}