利用归并排序的思想求逆序对
#include<stdio.h>
//#include<iostream>
#include <algorithm>
using namespace std;
int a[100005];
int left[100005], right[100005];
typedef long long ll;
ll ans=0;
void merge(int* a, int p, int q, int r)
{
int i, j, k, n1, n2;
n1 = q-p+1;
n2 = r-q;
for (i=0; i<n1; i++)
{
left[i] = a[p+i];
}
for (i=0; i<n2; i++)
{
right[i] = a[q+i+1];
}
left[n1] = right[n2] = 0x7fffffff;
i = j = 0;
for (k=p; k<=r; k++)
{
if (left[i] <= right[j])
{
a[k] = left[i];
i++;
}
else
{
a[k] = right[j];
j++;
ans += n1-i; /*求逆序数的数目*/
}
}
return;
}
void mergesort(int* a, int p, int r)
{
int q;
if (p < r)
{
q = (p+r)/2;
mergesort(a, p, q);
mergesort(a, q+1, r);
merge(a, p, q, r);
}
return ;
}
int main()
{ // ios::std::sync_with_stdio(false);
int n,k;
while(~scanf("%d%d",&n,&k))
{ ans=0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(a,0,n-1);
printf("%I64d\n",max(ans-k,(ll)0));
}
return 0;
}