树状数组 模板3 求逆序对(非离散化)

离散化的树状数组:https://blog.csdn.net/A_Pathfinder/article/details/88042960

这里就提一下和普通树状数组的区别,这里是用要查询的数当作下标,而普通树状数组是直接顺序下标放值,也就是说区别在于
updata函数,普通的是updata(i,k);//这里的i就单纯是区间下标;而求逆序对的时候是updata(a[i],1)。我们每次都是在这个数字大小的位置上添加1,然后去更新树状数组,在计算逆序数的时候,只需要查看一下比这个数小或等于的数有多少个,然后现在的位数减去前面比它小的就是所得这一位的逆序数。所有如果要判断的值过大,就要离散处理了。

#include
using namespace std;
const int maxn=1000000;
int c[maxn];
int n;
int lowbit(int x){
	return x&(-x);
}
void updata(int pos,int k){
	for(int i=pos;i<=n;i+=lowbit(i))
	c[i]+=k; 
}
int getsum(int x){
	int ans=0;
    for(int i=x;i;i-=lowbit(i)){
		ans+=c[i];
	}
	return ans;
}
int main(){
	int nx=0,a;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
	scanf("%d",&a);
	updata(a,1);
	nx+=(i-getsum(a));//用他在的位置减去比他小的个数,就是前面比他大的个数
	}
	cout<

 

你可能感兴趣的:(模板,树形结构)