数据结构树状数组

前言

先推荐几个讲解的比较好的博客或视频:
树状数组基础及应用

一、树状数组的应用

  1. 树状数组解决区间和
  2. 树状数组解决单点查询
    模板如下:
int d[100005],n;


int lowbit(int x)
{
    return x&(-x);
}
int query(int x)//查询前缀和
{
    int res=0;
    while(x)
    {
        res+=d[x];
        x-=lowbit(x);
    }
    return res;
}
void add(int x,int v)//单点加操作
{
    while(x<=n)
    {
        d[x]+=v;
        x+=lowbit(x);
    }
}


  1. 二维树状数组
    模板如下:
struct BIT_2D
{
    int d[301][301];
    void update(int x,const int&y.const int&v)
    {
        for(;x<=n;x+=(x&(-x)))
            for(int j=y;j<=n;j+=(j&(-j)))
            d[x][j]+=V;
    }
    int getSum(int x,const int&y)
    {
        int res=0;
        for(;x;x-=(x&(-x)))
            for(int j=y;j;j-=(j&(-y)))
            res+=d[x][j];
        return res;
    }
}T;

对于区间最值的问题,推荐采用线段树来写
树状数组是一种比线段树功能少,但是实现简单,常数小的数据结构

原文地址:https://www.cnblogs.com/bryce1010/p/9386965.html