#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e6+7;
int sum[maxx];
int a[maxx];
int b[maxx];
typedef long long ll;
int n;
int lowbit(int x)
{
return x&-x;
}
void add(int pos,int add)
{
while(pos<=n)
{
sum[pos]+=add;
pos+=lowbit(pos);
}
}
int query(int pos)
{
int ans=0;
while(pos>0)
{
ans+=sum[pos];
pos-=lowbit(pos);
}
return ans;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
b[i]=a[i]; //准备离散化
}
sort(a+1,a+1+n); //排序
ll len=unique(a+1,a+1+n)-1-a;//去重,因为a是有n+1个数,所以要多-1
for(int i=1; i<=n; i++)
{
b[i]=lower_bound(a+1,a+1+len,b[i])-a; //获取b[i]可以在的下表
}
ll ans=0;
for(int i=n; i>0; i--) //倒叙查找和插入
{
ans+=query(b[i]-1);//查询这个点之前的
add(b[i],1); //插入
}
printf("%lld\n",ans);
return 0;
}
逆序对的数量(树状数组+离散化)
最新推荐文章于 2024-08-02 23:55:46 发布