题目
思路
求逆序对,边输入边操作,每输入一个数,他前面有多少个比他大的数,答案就加几。
用
a
i
a_i
ai 表示数为
i
i
i 的个数, 那么求
i
i
i 的前面有多少数比它大,
就是求
a
i
+
1
a_{i+1}
ai+1到
a
M
A
X
a_{MAX}
aMAX的和,也就是求
a
1
a_1
a1到
a
M
A
X
a_{MAX}
aMAX的和 减去
a
1
a_1
a1到
a
i
a_i
ai的和
这就可以用树状数组维护,
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)。
代码
#include<iostream>
using namespace std;
const int M=200000;
long long c[M+100],as,n,a;
void up(int x)//更新
{
for(; x<=M; x+=x&-x) c[x]++;
}
int sum(int x)//求和
{
int ans=0;
for(; x; x-=x&-x) ans+=c[x];
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i)
{
scanf("%d",&a);
up(a);
as+=sum(M)-sum(a);
}
cout<<as;
}