树状数组板子(单点增加+范围查询)

用于解决 范围数字和 与 单点增加 问题(复杂度O(logn))

build 方法(构造树状数组)

void build(){
	for(int i=1,v;i<=n;i++){
		cin>>v;
		add(i,v);
	}
}

lowbit方法 (获取一个二进制数最低位的1的状态)

int lowbit(int x){
	return x&(-x);
}

add方法 (单点增加)

void add(int i,int v){
	while(i<=n){
	tree[i]+=v;
	i+=lowbit(i);	
	}
}

sum方法(1~i 范围查询)

int sum(int i)//1~i范围累加和
{
	int ans=0;
	while(i>0){
		ans+=tree[i];
		i-=lowbit(i);
	}	
	return ans;
} 

range 方法(l~r范围查询)

int range(int l,int r){
	return sum(r)-sum(l-1);
}

posted @ 2025-01-20 13:05  Marinaco  阅读(11)  评论(0)    收藏  举报
//雪花飘落效果