用归并排序求逆序对。
不过数据好弱,貌似冒泡也不会超时,类似的题目有poj2299.
#include<stdio.h>
#include<string.h>
int Sce,N;
long long A[1010],L[1010],R[1010],cnt;
void merge(long long a[],int x,int m,int y)
{
int n1=m-x+1;
int n2=y-m;
int i,j;
for(i=1;i<=n1;i++)
{
L[i]=A[x+i-1];
}
for(j=1;j<=n2;j++)
{
R[j]=A[m+j];
}
L[n1+1]=0xFFFFF;
R[n2+1]=0xFFFFF;
i=1,j=1;
int k;
for(k=x;k<=y;k++)
{
if(L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
cnt=cnt+n1-i+1;
}
}
}
void merge_sort(long long a[],int x,int y)
{
if(x<y)
{
int m=(x+y)/2;
merge_sort(a,x,m);
merge_sort(a,m+1,y);
merge(a,x,m,y);
}
}
int main()
{
//freopen("test.txt","r",stdin);
int num;
scanf("%d",&Sce);
for(num=1;num<=Sce;num++)
{
scanf("%d",&N);
int i;
for(i=0;i<N;i++)
{
scanf("%lld",&A[i]);
}
cnt=0;
merge_sort(A,0,N-1);
printf("Scenario #%d:\n%d\n\n",num,cnt);
}
return 0;
}