线状数组

线状数组是一种数据结构,其查询和修改操作的时间复杂度为O(log n)。它主要用于快速获取任意两个位置间的元素和,并且允许单个元素值的修改。在数组a[]中存储原始数据,而c[]则用于存储线状数组,其中c[t]表示t所覆盖范围内的元素总和。理解线状数组的管辖范围和计算方法对于实现高效操作至关重要。

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

线状数组是一个查询和复杂度都是log(n)的数据结构,主要用来查询任意两位之间的所有元素之和,但每次只能修改一个元素的值,
数组a[]— 用来存放原始数据,c[]–就是树状数组,c[t] – 表示t管辖区间元素之和。
c[t] --管辖里2k个区间,k是t在二进制下末尾0的个数例如:8=(1000),那么管辖23=8个数。例如5 = (101)那么管辖20=1个数;
下面这个图非常直观;

在这里插入图片描述

如何计算t管辖的区间打下:(求t对应的2k);
下面两种皆可:

int lowbit(int x)
{
   
   
	return x&(x^(t-1));
}

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

n-lowbit(n) 将n二进制中最后一个(末尾)的1减去

点修改,区间查询

#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[50005],c[50005]; //对应原数组和树状数组

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

void updata(int i,int k){
   
       //在i位置加上k
    while(i <= n){
   
   
        c[i] += k;
        i += lowbit(i);
    }
}

int getsum(int i){
   
           //求A[1 - i]的和
    int res = 0;
    while(i > 0){
   
   
        res += c[i];
        i -= lowbit
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值