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
题目意思,就是给你一个长度为n的数列,让你任意的交换相邻的两个数,使得i<j, ai>aj,最后让求最小的倒置数,也就是逆序对数的。思路: 这道题呢,我们可以先求你选对数cnt,然后再用cnt-k,就是我们所要求的,不过要判断一下cnt-k的正负。
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=100005;
__int64 cnt;
int a[N],T[N],i,j,n,k;
void merge_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;
merge_sort(a,x,m,T);
merge_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(i=x;i<y;i++)
a[i]=T[i];
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
cnt=0;
merge_sort(a,0,n,T);
printf("%I64d\n",max(cnt-k,(__int64)0));
}
return 0;
}