首页 > 其他分享 >树状数组

树状数组

时间:2023-08-13 22:46:40浏览次数:40  
标签:... 树状 lowbit 分解 数组 +...+

树状数组运用了二进制分解原理

对于任意的整数x,都可以分解为:\(x=2^{i_1}+2^{i_2}+...+2^{i_m}\)
其中\(i_1>i_2>...>i_m\)
于是可以把\([1,x]\)分解成很多段
\([1,2^{i_1}]\)
\([2^{i_1}+1,2^{i_1}+2^{i_2}]\)
\([2^{i_1}+2^{i_2}+1,2^{i_1}+2^{i_2}+2^{i_3}]\)
. . .
\([2^{i_1}+2^{i_2}+...+2^{i_{m-1}}+1,2^{i_1}+2^{i_2}+...+2^{i_m}]\)

比如\(7=4+2+1\)
于是\([1,7]=[1,4]+[5,6]+[6,7]\)
定于 \(lowbit(x)\) 表示 \(x\) 在 \(2\) 分解下最小的幂
\(lowbit(7)=1,lowbit(6)=2,lowbit(4)=4\)
公式:\(lowbit(x)=x\&-x\)

树状数组:维护序列前缀和
\(c[x]\) 表示区间 \([x-lowbit(x)+1,x]\) 之间的数的和

如图

其中 \(c[x]\) 的父亲节点是 \(c[x+lowbit(x)]\)

标签:...,树状,lowbit,分解,数组,+...+
From: https://www.cnblogs.com/lighthqg/p/17627427.html

相关文章

  • 88. 合并两个有序数组
    88.合并两个有序数组2023年8月13日17:05:4588.合并两个有序数组简单给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后......
  • 3 字符串向量数组
    当把string对象和子符字面值混在一条语句中使用时,必须确保每个+运算符的两侧的运算对象至少有一个是string用花括号对vector做初始化,不能用下标形式添加元素迭代器,iterator const_iterator两种迭代器类型,如果vector或string对象是常量,只能使用const_iterator。对vect......
  • 数组的运用
    数组的使用For-Each循环数组作方法入参数组作返回值packagearray;​publicclassArrayDemo04{  publicstaticvoidmain(String[]args){    int[]arrays={1,2,3,4,5};    //打印全部数组元素    for(inti=0;i<arrays.leng......
  • #yyds干货盘点# LeetCode程序员面试金典:数组中的第K个最大元素
    题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例1:[3,2,1,5,6,4],示例 2:[3,2,3,1,2,4,5,5,6],代码实现:class......
  • 算法刷题:数组题(持续更)
    算法刷题系列:算法刷题:链表题(持续更)力扣链接:删除有序数组中的重复项删除排序链表中的重复元素移除元素移除链表元素两数之和反转字符串反转链表验证回文串验证回文串II目录快速排序原理代码实现快慢指针注意事项异步移动删除有序数组的重复项代码实现对比链表的删......
  • 数组
    数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便地通过下标索引的方式获取到下标下对应的数据。因为数组的内存空间地址是连续的,所以在删除和添加元素的时候,就要移动其他元素的地址。数组的元素是不能删除的,只能覆盖。二维数组的存储如下: ......
  • 数组及元组
    第3章数组及元组3.1定长数组定义长度不变的数组可以使用ArrayScala数组的底层实际上是Java数组。例如字符串数组在底层就是Java的String[],整数数组在底层就是Java的Int[]valnums=newArray[Int](10)//生成10个整数的数组,所有元素初始化为0valnums=newArray[String](......
  • 树状数组
    前置知识:lowbit运算\(lowbit(x)\)表示正整数\(x\)在二进制表示下最低位的\(1\)跟后面的\(0\)构成的数值,有\(lowbit(x)=x\)&$($~\(~x+1)\),即\(lowbit(x)=x\)&\(-x\),理由如下:\(lowbit(x)\)是最后一位\(1\)所以跟前面的位没啥关系,祂在二进制表示下肯定就是\(......
  • 链表和数组的区别
    链表和数组的区别链表逻辑上相邻的元素在物理位置上不一定相邻。优点:插入、删除效率高,不需要一个连续的很大的内存缺点:查找某一个位置的元素效率低。数组优点:存取速度快缺点:1.整块连续空间,占很大内存。2.插入或删除数据效率低、不方便链表数组逻辑上相......
  • 随笔-C-指针数组使用简记
    typedefstructmem_list*cns_detail_encode_result[encode_type_max];(gdb)p&((structmem_list**)0x7fffb4557950)[0]#&取对应点的位置$29=(structmem_list**)0x7fffb4557950(gdb)p((structmem_list**)0x7fffb4557950)+0$30=(structmem_list**)......