树状数组求逆序数
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;
}
一个数列的逆序数等于 每一个数字前面比它大的数的个数和,比如 :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;
}
相关文章推荐
- Japan 树状数组加逆序数...
- 蓝桥杯--历届试题 小朋友排队(树状数组求逆序数)
- poj 3067 Japan 树状数组求逆序数
- 树状数组求逆序数的原理
- 光荣的梦想 (树状数组求逆序数和)
- Minimum Inversion Number(树状数组求逆序数+找数学规律)
- hdu 2689 sort it(树状数组 逆序数)
- 树状数组与分治法求逆序数
- HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用
- hdoj 1394 Minimum Inversion Number【树状数组求逆序数--逆序数的性质】
- HDU2838(树状数组求逆序数)
- codeforces 362 C. Insertion Sort(树状数组,逆序数)
- 树状数组求逆序数的模板(离散化处理)
- HDU2689 Sort it(树状数组求逆序数)
- 树状数组求逆序数
- hdu4911——Inversion 树状数组求逆序数对
- POJ 2299-Ultra-QuickSort(树状数组求逆序数)
- hud 2838 Cow Sorting 树状数组求逆序数
- 树状数组求逆序数(模板)
- POJ2299 树状数组求逆序数