归并排序求交换次数
#include<stdio.h>
#define N 100005
int in[N],tmp[N];
__int64 s;
void merge(int l,int mid,int r)
{
int i,j,k;
i=l;j=mid+1;k=1;
while(i<=mid&&j<=r)
{
if(in[j]<in[i])
{
tmp[k++]=in[j];
j++;
s+=mid-i+1;
}
else
{
tmp[k++]=in[i];
i++;
}
}
while(i<=mid)
tmp[k++]=in[i++];
while(j<=r)
tmp[k++]=in[j++];
k=1;
for(i=l;i<=r;i++)
{
in[i]=tmp[k];
k++;
}
}
void mergesort(int l,int r)
{
if(l<r)
{
int mid=(l+r)>>1;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,mid,r);
}
}
int main()
{
int n,k,i;
while(scanf("%d%d",&n,&k)!=EOF)
{
s=0;
for(i=0;i<n;i++)
scanf("%d",&in[i]);
mergesort(0,n-1);
if(s>k)
s-=k;
else
s=0;
printf("%I64d\n",s);
}
return 0;
}