首页 > 其他分享 >树状数组理解方式

树状数组理解方式

时间:2024-02-28 20:44:40浏览次数:20  
标签:树状 int lowbit modify 理解 数组 res 节点

 tr[i]节点存储的是a[i-lowbit(i)+1]+……+a[i],一共lowbit(i)个数字之和。

query的理解:

int query(int k)
{
    int res = 0;
    for (int i = k; i; i -= lowbit(i))
        res += tr[i];
    return res;
}

每次减去当前的lowbit,就可以退回到上一个区间,直至到0

modify的理解:

void modify(int k, int x)
{
    for (int i = k; i <= n; i += lowbit(i))
        tr[i] += x;
}

modify的原则就是:调节所有受影响的区间。

1.如果快速切换到包含自己的区间?

根据树状数组的性质,我们可以知道,想要到达一个树中节点的上一层,就是要到达一个lowbit更高的位置,lowbit更低的节点一定和当前节点同一层,lowbit相同的节点一定在上一层的更上方。

因此我们的目标位置就是满足lowbit(k)=lowbit(i)<<1的节点

只需要i+=lowbit(i)就可以实现这个操作。

2.是否保证了不会影响同层级节点?

同层级的节点就是那些满足了这样的k:lowbit(k)<lowbit(i) && k > i

显然,这些节点的覆盖范围的左端点在当前区间的右侧,而他们的直属上层节点w=k+lowbit(k),其覆盖范围的左端点也在当前区间右侧。

综上,modify操作只会修改那些它应该涉及到的节点,除此之外的节点仍保有其原来的值。

标签:树状,int,lowbit,modify,理解,数组,res,节点
From: https://www.cnblogs.com/smartljy/p/18041773

相关文章

  • 《程序是怎样跑起来的》第六章理解
    在计算机中,文件通常是以字节为单位存储的。一个字节由8位组成,是计算机存储和传输数据的基本单位。在保存文件时,操作系统或文件管理系统会将文件内容划分为一系列字节,并将这些字节存储在磁盘或其他存储介质上。每个字节都可以独立地存储和访问。RLE是一种简单的无损数据压缩算法。......
  • c语言进行时4-函数与数组
    什么是函数?函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或者一个值。函数定义:本地变量(局部变量):函数的每次运行,就产生了而一个独立的变量空间,在这个空间的变量,是函数的这次运行所独有的,称作本地变量,也称局部变量。定义在函数内部的变量就是本地变量。参数也是本地......
  • 350. 两个数组的交集 II C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intmin(inti,intj){if(i<j)returni;returnj;}int*intersect(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]=......
  • JAVA基础:数组遍历
    遍历:一个一个访问 packagecom.itheima.arry;publicclassArryDemo2{publicstaticvoidmain(String[]args){//掌握数组遍历int[]ages=newint[]{12,24,36};//System.out.println(ages[0]);//System.out.println(ages[1]);......
  • JAVA基础:数组访问
     packagecom.itheima.arry;publicclassArryDemo1{publicstaticvoidmain(String[]args){//掌握数组访问int[]ages=newint[]{12,52,630};//修改数组中数据ages[0]=66;ages[1]=100;System.out.println(......
  • 349. 两个数组的交集C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/int*intersection(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]={0};inthash2[1001]={0};int*tem=(int*)malloc(sizeof......
  • 《程序是怎样跑起来的》第五章理解
    计算机的内存是直接与CPU通信的存储介质,它的访问速度非常快。当程序或数据存储在磁盘上时,CPU不能直接访问它们,因为磁盘的访问速度比内存慢得多。为了执行程序或访问数据,它们首先需要被加载到内存中,这样CPU才能快速访问它们。磁盘缓存是一种利用高速内存(通常是RAM)来存储最近访问过......
  • Java数组声明和初始化
    Java数组声明和初始化//数组的声明和初始化double[]prices;//静态初始化,数组变量的赋值和数组元素的赋值操作同时进行prices=newdouble[]{1,2.1,3.22};//动态初始化,数组变量的赋值和数组元素的赋值操作分开进行String[]foods=newString[......
  • 《程序是怎样跑起来的》第四章理解
    物理内存是计算机中真实的、有限的存储空间。它由许多存储单元组成,每个单元都有一个唯一的地址。CPU通过这些地址来访问和存储数据。内存的逻辑模型是一个抽象的概念,用于描述程序如何与内存交互。在这个模型中,内存被分为几个部分,如堆、栈、全局/静态存储区等。程序通过指针或引......
  • php生成树状层级子孙树
    关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了。以下是迭代的代码实现<?php$data=[['id'=>1,'name'=>'中国','pid'=>0......