hdu 4911 归并排序求逆序数

来源:互联网 发布:java unexpected token 编辑:程序博客网 时间:2024/05/16 06:25

因为给定一个序列,那么这个序列的逆序数就是一个定值,每次改变都会减少一个逆序数,所以求出总的逆序数后与k比较大小即可

附上代码:

     

#include<stdio.h>#define N 100005int a[N],tmp[N];long long 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(a[i]>a[j])        {            tmp[k++]=a[j++];            s+=mid-i+1;        }        else        {            tmp[k++]=a[i++];        }    }    while(i<=mid)        tmp[k++]=a[i++];    while(j<=r)        tmp[k++]=a[j++];    k=1;    for(i=l;i<=r;i++)    {        a[i]=tmp[k++];    }}void mergesort(int l,int r){        if(l==r)return ;        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=1;i<=n;i++)            scanf("%d",&a[i]);        mergesort(1,n);        if(s>k)            s-=k;        else            s=0;        printf("%I64d\n",s);    }    return 0;}

0 0