树状数组(Binary Indexed Tree)

所需变量

	int size=0;
	int topbit=1;
	vector<int> tree;

辅助操作

	int lowbit(int x){return x&(-x);}
	void init(int x)
	{
		size=x;
		topbit=1;
		while((topbit<<1)<=size) topbit<<=1;
		tree.assign(size+2,0);
	}
	void clear(){fill(tree.begin(),tree.end(),0);}

基本操作

更新

void add(int x,int val)
	{
		while(x<=size)
		{
			tree[x]+=val;
			x+=lowbit(x);
		}
	}

求前缀和

int danquery(int x)
	{
		if(x<0) return 0;
		int ret=0;
		while(x)
		{
			ret+=tree[x];
			x-=lowbit(x);
		}
		return ret;
	}

求区间和

int rangquery(int l,int r) {return l>r?0:danquery(r)-danquery(l-1);}

求第K小(树状数组维护桶)

int kth(int rank)
	{
		int pos=0;
		for(int i=topbit;i;i>>=1)
		{
			int op=pos+i;
			if(op<=size&&tree[op]<rank)
			{
				pos=op;
				rank-=tree[op];
			}
		}
		return pos+1;
	}

刚写博客,写得先糙一些

posted @ 2026-07-14 21:42  wang7979  阅读(5)  评论(0)    收藏  举报