题意:有一串序列,(数字各不相同),每次只能够交换相邻的两个数字,问将其排为升序所需的交换次数。
没什么想法,COPY的网上题解。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>`
#include <algorithm>
#include <cctype>
#include <set>
#include <vector>
#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;
int n,m,tot=0;
int a[500009],tt[500009];
long long mergesort(int l,int r){
if(l==r) return 0;
int mid=(l+r)>>1;
long long cnt=0;
cnt=mergesort(l,mid)+mergesort(mid+1,r);
int i=l,t=mid+1,k=l;
while(i<=mid&&t<=r){
if(a[i]<=a[t]) tt[k++]=a[i++];
else{ cnt+=(mid-i+1); tt[k++]=a[t++]; }
}
while(i<=mid) tt[k++] =a[i++];
while(t<=r) tt[k++] =a[t++];
for(i=l;i<=r;i++) a[i]=tt[i];
return cnt;
}
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT,i,k,t;
while(scanf("%d",&n)&&n)
{
for(i=0;i< n;i++) scanf("%d",&a[i]);
long long ans =mergesort(0,n-1);
printf("%I64d\n",ans);
}
return 0;
}