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

树状数组

时间:2023-09-07 19:44:17浏览次数:42  
标签:树状 二进制 lowbit 复杂度 数组 logn

树状数组用于变化区间的动态维护进行 \(O(logn)\) 的插入和删除。

\(lowbit(x)\) 表示二进制表示中最低位的1代表的值称为最小位值,实际上就是二进制表示中最低位的1代表的值称为最小位值 二进制表示中最低位的1加上后面的0的值。

设树状数组\(c\), \(c_i\) 表示 ${\textstyle \sum_{i = i - lowbit(i) + 1}^{i}c[i]} $,每次修改操作只需要修改包含 \(i\) 的c, 复杂度为 \(O(logn)\)。每次查询操作,将分段拼起来,复杂度为 \(O(logn)\)。


void init() {
	for (int i = 1; i <= n; i++) {
 	   c[i] = a[i];
 	}
}

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

void add(int x, int y) {
  for (int i = x; i <= n; i += lowbit(i)) {
    c[i] += y;
  }
}

int sum(int x) {
  int ans = 0;
  for (int i = x; i > 0; i -= lowbit(i)) {
    ans += c[i];
  }
  return ans;
}

当需要区间修改时,就需要差分了。

\(c\) 不再需要初始值,最后加上就行。

add(u, k), add(v + 1, -k);

cout << a[u] + sum(u) << '\n';

标签:树状,二进制,lowbit,复杂度,数组,logn
From: https://www.cnblogs.com/jiangyuchen12/p/17685910.html

相关文章

  • 动态规划在二维数组上的运用
    力扣连接:https://leetcode.cn/problems/unique-paths/题目一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例1:输入:m=3,n=......
  • 数组与地址,数组名到底是什么?
    (数组与地址,数组名到底是什么?1.问题引出案例:设计一个函数,可以将整形数组的次序调换例如:arr[5]={1,2,3,4,5},输出形式为:arr[5]={5,4,3,2,1}.案例代码://能否可以正常排序?#include<stdio.h>voidreverse(int*arr){ intlen=sizeof(arr)/sizeof(arr[0]); inttop......
  • day1 - 数组part01
    力扣704.二分查找思路:假如有n个数,数组下标就是0到n-1,那么第一次从n/2开始找如果这个数比目标数大,说明目标数在左边,于是从0到中间边界找。如果这个数比目标数小,说明目标数在右边,于是从中间边界+1到n-1找。为了明确中间边界是多少,举个例子: 假如数组是:0,1,3,5,6,7,8;target......
  • 使用JavaScript计算两点经纬度之间的弧线点经纬度数组
    前言地球是一个近似于椭球体的三维物体,因此在计算两个经纬度点之间的距离时,不能简单地将其视为平面上的直线距离。相反,我们需要考虑地球的曲率,并使用球面三角法来计算两点之间的弧线距离及其中的插值点。通过本篇博客,我们将使用JavaScript来实现根据两个经纬度点返回两点之间的弧......
  • 【Leetcode刷题记录】1、统计参与通信的服务器;2、统计二叉树中好节点的数目;3、从两个
    1、统计参与通信的服务器题目:这里有一幅服务器分布图,服务器的位置标识在 m*n 的整数矩阵网格 grid 中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。请你统计并返回能够与至少一台其他服务器进行通信的服务器的......
  • 数组转树
    constlist=[{id:1,name:'部门1',pid:0},{id:2,name:'部门1-1',pid:1},{id:3,name:'部门1-2',pid:1},{id:4,name:'部门1-1-1',pid:2},{id:5,name:'部门1-2-1',pid:3},{id:6,name:&#......
  • 【C语言进阶】指针数组 —— 数组指针
    (文章目录)......
  • SpringBoot启动报数组下标越界
    问题描述:启动读取配置文件时报错关键字:ERRORorg.springframework.boot.SpringApplication-Applicationrunfailedjava.lang.ArrayIndexOutOfBoundsException:-1ConnectedtothetargetVM,address:'127.0.0.1:58753',transport:'socket'2023-09-0611:09......
  • java中String和数组的长度
    数组的长度是lengthString的长度是length()在Java中,数组是引用数据类型,不是类,因此也是读取固有的length属性得到数组长度,它没有length()方法。但是,java中的String类型是jdk中已经封装好的final类,类就有属性和方法,只是String没有length属性,只有length()方法。......
  • 剑指 Offer 42. 连续子数组的最大和
    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。classSolution{publicintmaxSubArray(int[]nums){......