首页 > 其他分享 >树状数组学习笔记

树状数组学习笔记

时间:2022-12-03 16:55:06浏览次数:35  
标签:前缀 val 树状 int text 笔记 数组 lowbit

树状数组学习笔记

简介

树状数组是一个可以在 \(O(\log n)\) 的时间复杂度内支持单点修改和查询前缀和的操作的数据结构。

\(\text{lowbit}\)

\(\text{lowbit}\) 是指一个数在二进制下最末尾的1的位置。\(\text{lowbit(x) = x and -x}\)

写法

建立

把编号为 \(i\) 的点和编号为\(i+\text{lowbit}(i)\)的点连起来。

然后把点\(i\)到根节点路径上的所有点的\(val\)加上\(a_i\)。

修改

把点\(i\)到根节点路径上的所有点的\(val\)加上\(data\)。

查询

如果要查询\([l,r]\)的和,就可以用\(r\)的前缀和减去\(l-1\)的前缀和。

如何求前缀和呢?

就是从点 \(i\) 一直往下跳 (\(\text{-lowbit(i)}\)),直到跳到0,把中间的所有\(val\)加起来就是前缀和了。

代码

int val[MAXN];
void change(int x,int data){//修改&建立
    for(int i=x;i<=MAXN;i+=lowbit(i))val[i]+=data;
}
int ask(int x){//前缀和
    int ans=0;
    for(int i=x;i!=0;i-=lowbit(i))ans+=val[i];
    return ans;
}
int ask(int l,int r){//查询
    return ask(r)-ask(l-1);
}

二维树状数组

可以求出二维数组里的前缀和,时间复杂度\(O(\log^2 n)\)。

与一维树状数组相似。

int val[MAXN][MAXN];
void change(int x,int y,int data){//修改&建立
    for(int i=x;i<=MAXN;i+=lowbit(i))
    for(int j=y;j<=MAXN;j+=lowbit(j))
    val[i][j]+=data;
}
int ask(int x,int y){//前缀和
    int ans=0;
    for(int i=x;i!=0;i-=lowbit(i))
    for(int j=y;j!=0;j-=lowbit(j))    
    ans+=val[i][j];
    return ans;
}
int ask(int x1,int y1,int x2,int y2){//查询
    return ask(x2,y2)-ask(x2,y1-1)-ask(x1-1,y2)+ask(x1-1,y1-1);
}

标签:前缀,val,树状,int,text,笔记,数组,lowbit
From: https://www.cnblogs.com/maniubi/p/16948318.html

相关文章

  • 深度学习学习笔记
    python与pytorch数据类型区别:jupyter代码:......
  • 找到所有数组中消失的数字
    找到所有数组中消失的数字一、题目描述给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内没有出现在nums中的数字,并以数组形式返回。示......
  • 算法--数组、链表、栈、队列
    一、数组1、删除有序数组中的重复项(简单)题目地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/给你一个升序排列的数组nums,请你原地删除重......
  • Cinemachine Brain笔记
    CinemachineBrain来源于:Unity相机管理:CinemachineBrain属性详解LiveCamera:当前正在使用的虚拟相机LiveBlend:虚拟相机的切换过程(从哪个虚拟相机切换到哪个虚拟相机)......
  • linux运维之道学习笔记
    linux常用命令1、find命令   find/"*.log"查找/目录下.log结尾的档案   find/-mtime-3查找/目录下三天内被修改的档案   find/-mtime+4 查......
  • LeetCode刷题笔记
    前言:我是从大四上学期开始刷算法题的,那时候比较迷茫,不知道做什么。想着提升一下自己,就看着B站代码随想录的视频,然后开始在力扣上刷题。当你陷入迷茫,不知道学什么的时候,只要......
  • 视频超分之BasicVSR-阅读笔记
    1.介绍   对于视频超分提出了很多方法,EDVR中采用了多尺度可变形对齐模块和多个注意层进行对齐和定位并且从不同的帧聚合特征,在RBPN中,多个投影模块用于顺序聚合多个帧......
  • Javascript随机排列数组-要求概率一样
    今天做了一道很有意思的题。如何在Js中实现一个随机排列数组的算法,要求排列之后每一次组合出现的概率相同。完整题目如下:etarr=[1,2,3];shuffle(arr);//arr=[3......
  • Canvas学习笔记(二)绘制矩形
    在Canvas中,矩形分为“描边”矩形和“填充”矩形两种。“描边”矩形在Canvas中,我们使用strokeStyle属性和strokeRect()方法配合使用来绘制一个“描边”矩形。语法:ctx.str......
  • Linux笔记02: Linux环境_2.2 Linux系统安装
     2.2Linux系统本文使用的Linux系统为CentOS7.9.2009,读者可以根据自己的需要选择不同的版本。 2.2.1CentOS版本CentOS基本上是安装在i386、x86_64的CPU硬......