您的位置:首页 > 其它

Inversion(hdu 4911)

2015-08-08 15:11 190 查看

此题链接单击这里

=================

题意:

有N个数,每次只能和相邻的数交换,只能交换K次,问最少有多少个逆序对(就 是一个数前面有多少个数比它大)。

思路:

用归并排序按升序排列,在排列时记录所有的逆序对。排列完以后用所有的逆序对减K就是行了(注意负数时输出0)

付代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
long long a[110000];
long long b[110000];
long n;
long long cnt;
long long l;
long long k;
void funt(long x,long y)
{
if(y-x>1){
long m=x+(y-x)/2;
long p=x,q=m,i=x;
funt(x,m);
funt(m,y);
while(p<m||q<y)
{
if(q>=y||(p<m&&a[p]<=a[q]))
b[i++]=a[p++];
else
{
b[i++]=a[q++];
cnt+=m-p;
}
}
for(i=x;i<y;i++)
a[i]=b[i];
}
}
int main()
{

while(scanf("%ld%lld",&n,&k)==2)
{
cnt=0;
memset(b,0,sizeof(b));
for(long  i=0;i<n;i++)
scanf("%lld",&a[i]);
funt(0,n);
if(cnt>k)
printf("%lld\n",cnt-k);
else
cout<<0<<endl;
}
}


有问题联系企鹅791267032

邮箱地址….wutanrong@Hotmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: