在树状数组中最常用到的就是求逆序数了,那么给你一串数字那么我们如何来求逆序数呢?
下面给出代码示例:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
#include <algorithm>
#define maxn 15
using namespace std;
int c[maxn],b[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int v)
{
while(x<=maxn)
{
c[x]+=v;
x+=lowbit(x);
}
}
int sum(int x)
{
int res=0;
while(x>0) //注意此处是大于0,因为树状数组中0位置是没有意义的。
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
int main()
{
memset(c,0,sizeof(c));
long long ans=0;
int n;
int i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>b[i];
}
for(i=1;i<=n;i++)
{
add(b[i],1);
ans+=sum(n)-sum(b[i]);
}
cout<<ans<<endl;
return 0;
}
测试数据: