举个例子加以说明: 例子来源
假设给定的序列为 4 3 2 1,我们从左往右依次将给定的序列输入,每次输入一个数temp时,就将当前序列中大于temp的元素的个数计算出来,并累加到ans中,最后ans就是这个序列的逆序数个数。
序列的变化(下划线为新增加元素)
序列中大于新增加的数字的个数
操作
{ }
0
初始化时序列中一个数都没有
{4 }
0
往序列中增加4,统计此时序列中大于4的元素个数
{4 3 }
1
往序列中增加3,统计此时序列中大于3的元素个数
{4 3 2}
2
往序列中增加2,统计此时序列中大于2的元素个数
{4 3 2 1}
3
往序列中增加1,统计此时序列中大于1的元素个数
当所有的元素都插入到序列后,即可得到序列{4 3 2 1}的逆序数的个数为1+2+3=6.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[1000],b[1000],c[1000]={0};
int n;
int lowbit(int x)
{
return x&(-x);
}
int Getsum(int i)
{
int ans=0;
while(i>0)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
void Update(int i,int v)
{
while(i<=n)
{
c[i]+=v;
i+=lowbit(i);
}
return ;
}
void LS()
{
int m=0;
for(int i=1; i<=n; ++i)
b[++m]=a[i];
sort(b+1,b+1+m);
m=unique(b+1,b+1+m)-b-1;
for(int i=1; i<=n; ++i)
a[i]=lower_bound(b+1,b+1+m,a[i])-b;
return ;
}
int NXD()
{
int ans=0;
for(int i=1; i<=n; i++)
{
Update(a[i],1);
ans+=(i-Getsum(a[i]));//统计当前序列中大于a[i]的个数
}
return ans;
}
int main()
{
int i,j,k;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>a[i];
Update(i,a[i]);
}
//cout<
//cout<
//LS();
// for(i=1; i<=n; i++)
// cout<
//cout<
//cout<
return 0;
}