树状数组

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;
}
posted @ 2025-01-20 21:18  流氓兔LMT  阅读(12)  评论(0)    收藏  举报