树状数组的使用

1.树状数组解决的问题

(1)解决动态前缀和的数据结构

(2)求(ai -aj)位置的和,1<= i <= j <= n

  (3)  a[i]位置会动态加上某个数  1<= i <= n

 

2.树状数组核心代码

int lowbit(int u)
{
    return u & - u;
}

int add(int u,int k)    //在u位置加上k
{
    for(int i = u;i <= n;i +=lowbit(i))
    t[i] += k;
}

int getsum(int u)   //求1 - u 的和
{
    int res = 0;
    while(u > 0)
    {
        res += t[u];
        u -= lowbit(u);
    }
    
    return res;
}

 3.实例运用

(1)

 

(2)代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n,m;
int s[N],t[N];

int lowbit(int u)
{
    return u & - u;
}

int add(int u,int k)
{
    for(int i = u;i <= n;i +=lowbit(i))
    t[i] += k;
}

int getsum(int u)
{
    int res = 0;
    while(u > 0)
    {
        res += t[u];
        u -= lowbit(u);
    }
    
    return res;
}

int main()
{
    cin >> n >> m;
    
    for(int i = 1;i <= n;i ++)
    {
        cin >> s[i];
        add(i,s[i]);  //在i的位置加上s[i]  数组初始化
    }
    
    while(m --)
    {
        int a,b,c;
        cin >> a >> b >> c;
        if(a == 1)
        add(b,c);  //在b的位置加上c  数组动态变化
        else
        cout << getsum(c) - getsum(b - 1) << endl;  //求c - b 的和
    }
    
    return 0;
}

 

posted @ 2022-04-02 09:51  [吃瓜][吃瓜]  阅读(31)  评论(0)    收藏  举报