朴素的逆序数算法:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+10;
int a[maxn];
int main()
{
memset(a,0,sizeof(a));
int t,n;
long long sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
sum =sum+ a[t];//如果出现了就加上去
for(int j=0;j<t;j++)
a[j]++;//比这个数小的就++,后面可能会用到.
}
printf("%lld\n",sum);
return 0;
}
对于非常大的数,我们需要离散化,离散化并不会影响逆序对个数
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define MAXN 100000+5
ll a[MAXN],b[MAXN],n;
ll tree[MAXN],vis[MAXN];
ll lowbit(ll x)
{
return x&(-x);
}
void add(ll x,int val)
{
for(ll i=x;i<=n;i=i+lowbit(i))
{
tree[i]+=val;
}
}
ll get(ll x)//getsum
{
ll ans=0;
for(ll i=x;i;i=i-lowbit(i))
{
ans+=tree[i];
}
return ans;
}
int main()
{
memset(tree,0,sizeof(tree));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d",&n);
for(ll i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
ll cnt=unique(b+1,b+1+n)-b-1;
for(ll i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+1+n,a[i])-b;//离散化
ll ans=0;
for(ll i=1;i<=n;i++)
{
add(a[i],1);
ans+=i-get(a[i]);//get(a[i])为0-a[i]的个数,n-get(a[i])就是比a[i]大的个数
}
printf("%lld\n",ans);
return 0;
}