分析:你可以交换k次相邻的两个数,所以呢,最后逆序对数-k就ok,特判cnt-k<0 水水更健康~
代码:
#include<cstdio>
#include<cstring>
using namespace std;
//#define test
const 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++];
else T[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 test
freopen("Hdu 4911 Inversion test.txt","r",stdin);
#endif
while(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");
else printf("%lld\n",cnt-k);
}
return 0;
}