您的位置:首页 > 其它

树状数组求逆序数

2014-09-23 23:57 225 查看
其实就是求冒泡排序的交换次数。

一个数列的逆序数等于 每一个数字前面比它大的数的个数和,比如 :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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组