其实就是求冒泡排序的交换次数。
一个数列的逆序数等于 每一个数字前面比它大的数的个数和,比如 :1 4 2 3 5 的逆序数为:0+0+1+1+0=2;
初始化,数组bit={0};
比如数列 1 4 2 3 5
第一步:bit = 0 0 0 0 1 //把最大的元素位置赋值为1,并求其前面所有元素的和,为0
第二步: 0 1 0 0 1 //第二大元素的位置赋值为1,,求其前面所有元素的和,为0
第三步: 0 1 0 1 1 //...........为1
第四步: 0 1 1 1 1 //............为1
第五步: 1 1 1 1 1 //............为0
用树状数组可以高效求某一区间上的和,并对某一元素更新
#include <iostream>
using namespace std;
int n,a[20];
int bit[20];
int sum(int i)
{
int s=0;
while(i>0)
{
s+=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x)
{
while(i<=n)
{
bit[i]+=x;
i+=i&-i;
}
}
void solve()
{
int ans=0;
for(int j=0;j<n;j++)
{
ans+=j-sum(a[j]);
add(a[j],1);
}
cout<<ans<<endl;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
solve();
return 0;
}
天下武功,唯快不破
浙公网安备 33010602011771号