#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e5+7;
ll g[maxn],c[maxn],li[maxn],cnt;
int n;
inline int lowbit(int x){return x&(-x);}
int get_sum(int x){
int sum=0;
while(x)sum+=c[x],x-=lowbit(x);
return sum;
}
int add(int x,int d){
while(x<maxn)c[x]+=d,x+=lowbit(x);
}
int find(ll x){
int l=1,r=cnt;
while(l<r){
int mid=l+r>>1;
if(li[mid]>=x)r=mid;
else l=mid+1;
}
return l;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&g[i]),g[i]+=2147483647,li[i]=g[i];
sort(li+1,li+1+n);cnt=1;
for(int i=2;i<=n;i++)if(li[cnt]!=li[i])li[++cnt]=li[i];
ll ans=0;
for(int i=1;i<=n;i++){
int x=find(g[i]);int sum=i-get_sum(x);add(x,1);
ans+=sum;
}
printf("%lld\n",ans-n);
return 0;
}
p1774 逆序对的理解
最新推荐文章于 2022-10-28 21:59:26 发布