题意 查询一个1..n的排列上的逆序对的个数
思路 用树状数组维护数组中可能取到的值。遍历排列,遍历到a[i]时,update(a[i],1),表示i位置及以后,a[i]出现的次数+1,然后query(a[i]),表示在i位置之前,小于等于a[i]的数有多少个,因此ans += i - query(a[i])
#include <stdio.h>
#include <string.h>
#define maxn 1003
int tree[maxn];
int n;
inline int lowbit(int x)
{
return x&(-x);
}
void update(int i,int x)
{
while(i <= n)
{
tree[i] += x;
i += lowbit(i);
}
}
int query(int i)
{
int ret = 0;
while(i > 0)
{
ret += tree[i];
i -= lowbit(i);
}
return ret;
}
int main()
{
while(scanf("%d",&n)==1)
{
int ans = 0;
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
update(a,1);
ans += i - query(a);
}
printf("%d\n",ans);
}
return 0;
}