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 （树状数组）

2016-07-07 22:50:44

杭电4911 Inversion(找最小逆序对数)

2014-10-28 15:04:11

hdu4911Inversion 树状数组求逆序对

2015-09-02 19:17:28

HDU - 4911

2017-08-09 20:33:16

HDU4911：Inversion

2014-08-06 14:04:58

hdu 4911 Inversion（归并排序求逆序对数）2014多校训练第5场

2014-08-06 08:36:01

Inversion(hdu 4911)

2015-08-08 15:11:23

hdu4911 简单树状数组

2014-08-06 15:56:13

hdu 4911求逆序数

2017-04-03 23:58:56

hdu 4911Inversion

2015-08-09 18:42:39

不良信息举报

HDU 4911 Inversion