# Inversion

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2930    Accepted Submission(s): 1083

Problem Description
bobo has a sequence a1,a2,…,an. He is allowed to swap two adjacent numbers for no more than k times.

Find the minimum number of inversions after his swaps.

Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and ai>aj.

Input
The input consists of several tests. For each tests:

The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).

Output
For each tests:

A single integer denotes the minimum number of inversions.

Sample Input
3 1 2 2 1 3 0 2 2 1

Sample Output
1 2

Author
Xiaoxu Guo (ftiasch)

Source

ac代码
#include <iostream>
#include <cstring>
using namespace std;

const int maxn=100000+5;
long long  a[maxn],t[maxn];
long long ans=0;

void mymerge(int x,int m,int y){

int tx=x,tm=m+1;
int k=0;
while(tx<=m && tm<=y){
if(a[tx]<=a[tm])
t[k++]=a[tx++];
else {
ans+=m-tx+1;
t[k++]=a[tm++];
}
}
while(tx<=m) t[k++]=a[tx++];
while(tm<=y) t[k++]=a[tm++];

for(int i=0;i<k;i++){
a[x++]=t[i];
}
}

void mergesort(int x,int y){

if(x==y) return ;
else {
int mid=(x+y)/2;
int xx=x,yy=y;
mergesort(xx,mid);
mergesort(mid+1,yy);

mymerge(xx,mid,yy);
//cout<<xx<<" "<<mid<<" "<<yy<<endl;
}

}
int main(){

int n,k;
while(cin>>n>>k){
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
for(int i=0;i<n;i++){
cin>>a[i];
}
ans=0;
mergesort(0,n-1);
if(k>ans) cout<<"0"<<endl;
else
cout<<ans-k<<endl;
}

return 0;
}


• 本文已收录于以下专栏：

举报原因： 您举报文章：HDU 4911 Inversion 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)