举个例子加以说明: 例子来源
假设给定的序列为 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<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include <cstring>
#include <map>
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<<lowbit(n)<<endl;//cout<<Getsum(n-2)<<endl;//LS();// for(i=1; i<=n; i++)// cout<<a[i]<<" ";//cout<<endl;//cout<<NXD()<<endl;return 0;
}