http://acm.hdu.edu.cn/showproblem.php?pid=4911
一场多校的签到题,树状数组离散化求逆序数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef __int64 ll ;
int n,k ; int tree[],b[] ;
struct node
{
int num,id ;
}a[] ; int lowbit(int x){return x&(-x) ;} void update(int i,int x)
{
while(i<=n)
{
tree[i]+=x ;
i+=lowbit(i) ;
}
} int sum(int i)
{
int res= ;
while(i>)
{
res+=tree[i] ;
i-=lowbit(i) ;
}
return res ;
}
int cmp(node aa,node bb)
{
return aa.num<bb.num ;
}
int main()
{
ll ans ;
while(~scanf("%d%d",&n,&k))
{
for(int i= ;i<=n ;i++)
{
scanf("%d",&a[i].num) ;
a[i].id=i ;
}
memset(tree,,sizeof(tree)) ;
memset(b,,sizeof(tree)) ;
sort(a+,a+n+,cmp) ;
b[a[].id]= ;
for(int i= ;i<=n ;i++)
{
if(a[i].num==a[i-].num)b[a[i].id]=b[a[i-].id] ;
else b[a[i].id]=i ;
}
ans= ;
for(int i= ;i<=n ;i++)
{
update(b[i],) ;
ans+=sum(n)-sum(b[i]) ;
}
printf("%I64d\n",ans-k>?ans-k:) ;
}
return ;
}