题目链接:https://ac.nowcoder.com/acm/contest/77/A?&headNav=www
题目大意:
如图:在4出现前,前面没有出现比4小的数的个数就是4对逆序对的贡献。
4出现, 比4小的数没有出现,那么(4, 1), (4, 2) (4, 3)都是逆序对。
5出现时,4已经出现那么 (5, 1), (5, 2) (5, 3)。
我们开一个权值数状数组。查询前缀和就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int sum[100010]={0}, n=100010;
int a[100010]={0};
void add(int p, int y)
{
while(p<=n)
{
sum[p]+=y;
p+=(p&-p);
}
}
int cx(int p)
{
int ans=0;
while(p)
{
ans+=sum[p];
p-=(p&-p);
}
return ans;
}
int main()
{
int n, m;
LL ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans+=i-cx(a[i])-1;
add(a[i], 1);
}
printf("%lld\n", ans);
return 0;
}