并规排序求逆序对数 hud 4911

来源:互联网 发布:阿里巴巴服装淘宝网 编辑:程序博客网 时间:2024/06/11 04:46


Problem Description
bobo has a sequence a1,a2,…,an. He is allowed to swap twoadjacent 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 12 2 13 02 2 1
 

Sample Output
12
 


题目意思,就是给你一个长度为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;}

0 0