树状数组(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;
}
刚写博客,写得先糙一些

浙公网安备 33010602011771号