l(x) = x - lowbit(x) + 1。即,l(x) 是 c[x] 管辖范围的左端点。
对于任意正整数 x,总能将 x 表示成 s*2^{k + 1} + 2^k 的形式,其中lowbit(x) = 2^k。
下面「c[x] 和 c[y] 不交」指 c[x] 的管辖范围和 c[y] 的管辖范围不相交,即 [l(x), x] 和 [l(y), y] 不相交。「c[x] 包含于 c[y]」等表述同理。
lowbit
int lowbit(int x)
{
return x&(-x); //最后一位1
}
一维
void update(int x,int y) //单点加
{
for(;x<=n;x+=lowbit(x)) c[x]+=y;
}
int sum(int x)
{
int ans=0;
for(;x;x-=lowbit(x))
ans+=c[x];
return ans;
}
二维
void update(int x,int y,int z) //单点加
{
for(;x<=n;x+=lowbit(x))
for(;y<=n;y+=lowbit(y))
c[x][y]+=z;
}
int sum(int x,int y)
{
int ans=0;
for(;x;x-=lowbit(x))
for(;y;y-=lowbit(y))
ans+=c[x][y];
return ans;
}
标签:单点,树状,int,lowbit,void,update,数组
From: https://www.cnblogs.com/-include-lmt/p/18682537