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 a
1,a
2,…,a
n. 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 a i>a j.
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 a i>a j.
Input
The input consists of several tests. For each tests:
The first line contains 2 integers n,k (1≤n≤10 5,0≤k≤10 9). The second line contains n integers a 1,a 2,…,a n (0≤a i≤10 9).
The first line contains 2 integers n,k (1≤n≤10 5,0≤k≤10 9). The second line contains n integers a 1,a 2,…,a n (0≤a i≤10 9).
Output
For each tests:
A single integer denotes the minimum number of inversions.
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
思路: 先求逆序数,然后比较与K的大小关系,若小于等于K那么答案就是0,否则就是ans-K
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;
}