具体学习参考https://blog.csdn.net/ssimple_y/article/details/53744096
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
ll p,a[N],sum[N],s[N];
int n;
int lowbit(int i)
{
return i&(-i);
}
void update(int i)
{
while(i<=n)
{
sum[i]+=1;
i+=lowbit(i);
}
}
ll get_sum(ll i)
{
ll ans=0;
while(i)
{
ans+=sum[i];
i-=lowbit(i);
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(sum));
memset(s,0,sizeof(s));
ll ans=0,Ans=0;
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
s[i]=a[i];
}
//离散化
sort(s,s+n);
int k=unique(s,s+n)-s;
for(int i=1; i<=n; i++) a[i]=(lower_bound(s,s+k,a[i])-s)+1;//保证下标从1开始
for(int i=1; i<=n; i++)
{
ll tmp=get_sum(a[i]);
update(a[i]);
ans+=tmp;//i前面小于等于a[i]的数个数
Ans+=i-1-tmp;//i前面小于等于a[i]的数个数,逆序数
// printf("i==%d a[i]==%lld tmp==%lld ans==%lld\n",i,a[i],tmp,i-tmp);
}
printf("%lld\n",ans);//小于等于当前元素的个数总和
printf("%lld\n",Ans);//求逆序数
}
return 0;
}