Hdu 4911 Inversion(裸归并排序)

来源:互联网 发布:李炎恢 javascript 编辑:程序博客网 时间:2024/05/16 17:58


分析:你可以交换k次相邻的两个数,所以呢,最后逆序对数-k就ok,特判cnt-k<0     水水更健康~

代码:

#include<cstdio>#include<cstring>using namespace std;//#define testconst int maxn = 100000+10;long long cnt;void marge_sort(int *A,int x,int y,int *T){if(y-x>1){int m=x+(y-x)/2;int p=x,q=m,i=x;marge_sort(A,x,m,T);marge_sort(A,m,y,T);while( p<m || q<y ){if( q>=y || (p<m && A[p]<=A[q]))T[i++]=A[p++];elseT[i++]=A[q++], cnt += m-p;}for(int i=x;i<y;i++)A[i]=T[i];// 这里写成了 0~n wrong了一次 }}int main(){long long n,k; // 用 long long  int A[maxn],T[maxn]; #ifdef testfreopen("Hdu 4911 Inversion test.txt","r",stdin);#endifwhile(scanf("%lld%lld",&n,&k)!=EOF){// k次调换可以使得逆序数-k cnt=0;for(int i=0;i<n;i++)scanf("%d",&A[i]);marge_sort(A,0,n,T);// 注意marge_sort()处理的是左闭右开 if(cnt-k<0)printf("0\n");elseprintf("%lld\n",cnt-k);}return 0;} 





0 0
原创粉丝点击