树状数组

本文详细介绍了一种高效的数据结构——树状数组(Binary Indexed Tree),包括其核心操作如求区间和、更新元素等,并通过示例代码展示了如何实现树状数组的基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Code:

//树状数组
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn = 50010;
int a[maxn];            //放元素的数组;
int bit[maxn];          //树状数组
int n;
int lowbit(int i)        //求i这个数只有i的随后一位为1的数如:
                         //lowbit(8) = 8  8:1000 -> 1000
                         //lowbit(6) = 2  6:0110 -> 0010
                         //lowbit(4) = 4  4:0100 -> 0100
{
    return i & (-i);     //机器补码的特性,强大的二进制
}

void add(int i, int x)   //元素a[i] 加上x
{
    for(i; i <= n; i += lowbit(i))
        bit[i] += x;
    return ;
}

int sum(int i)          //求a[1 ~ i]的和
{
    int s = 0;
    while(i > 0)
    {
        s += bit[i];
        i -= lowbit(i);
    }
    return s;
}

int main()
{
    int T;
    scanf("%d", &T);
    //getchar();
    for(int kase = 1; kase <= T; kase++)
    {
        int N;
        scanf("%d", &N);
        n = N;
        memset(a, 0, sizeof(a));
        memset(bit, 0, sizeof(bit));
        for(int i = 1; i <= N; i++)
        {
            int x;
            //scanf("%d", &x);
            scanf("%d", &a[i]);
            add(i, a[i]);
        }
        //要注意更改元素的值的时候,不能只更改树状数组里面的值,数组里面的值也应该更改
        //求(a ~ b )区间和的时候可以采用 sum(b) - sum(a-1)来求算
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值