168人阅读 评论(0)

# 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;
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：30523次
• 积分：1879
• 等级：
• 排名：千里之外
• 原创：165篇
• 转载：0篇
• 译文：0篇
• 评论：1条
文章分类
阅读排行
评论排行
最新评论