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

树状数组

时间:2022-12-25 16:56:21浏览次数:63  
标签:index 树状 int 线段 差分 数组

title: 树状数组
tags: 算法
date: 2022-11-28 13:36:11

本文章遵守知识共享协议 CC-BY-NC-SA ,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博客阅读。

简介

树状数组是一种可以快速更改单点并查询区间和的一种数据结构。

为啥不用线段树?因为树状数组省空间。

又因为毒瘤出题人一般不卡空间,所以建议学学线段树

前置知识

  • 位运算
  • 树(只有一点点)
  • 差分(改进会用到)

讲解

大概是长这个样子的:

树状数组-图1-图示

树状数组的核心在于这个函数:

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

根据位运算的一些知识,我们可以得到这个函数的作用是求一个数字最右边的 \(1\) 所代表的数值。

感性的理解一下,当前节点为 \(i\) ,父亲就为 \(i+lowbit(i)\)。

这样可以很快写出查询和修改的代码。

int query(int index){ // 查询 [1,n]
    int ans=0;
    while(index>0){
        ans+=data[index];
        index-=lowbit(index);
    }
    return ans;
}
void update(int index,int val){ // 单点更改
    while(index<=n){
        data[index]+=val;
        index+=lowbit(index);
    }
}

例题

温馨提示:树状数组的题线段树都可以做,对于例题,建议直接去看线段树

P3374-【模板】树状数组-1

直接套模板。

P3368-【模板】树状数组-2

这里会用到差分的知识,如果不理解可以看看还没写出来的差分的文章。

直接将原数组差分,然后查询就行。

标签:index,树状,int,线段,差分,数组
From: https://www.cnblogs.com/rickyxrc/p/17004211.html

相关文章

  • JavaScrip基础(三):数组
    索引数组内存中连续存储多个数据的数据结构创建创建空数组1.vararr=[];2.vararr=newArray();创建包含元素的数组vararr2=[97,85,79];vararr3=newArray("Tom......
  • 如何使用JavaScript对数字数组进行排序?
    英文| https://www.geeksforgeeks.org/how-to-sort-numeric-array-using-javascript/翻译|web前端开发(ID:web_qdkf)所述的JavaScript的Array.sort()方法被用来就地数组元......
  • 15个必须知道的JavaScript数组方法
    原文| https://www.ibrahima-ndaw.com/blog/15-must-known-javascript-array-methods-in-2020/译文|杨小二在JavaScript中,数组是一个特殊的变量,用于存储不同的元素。它......
  • 448. 找到所有数组中消失的数字
    找到所有数组中消失的数字给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返......
  • ECMAScript 6 入门教程—数组的扩展
    作者|阮一峰1、扩展运算符含义扩展运算符(spread)是三个点(​​...​​)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。console.log(...[1,2,3])//123......
  • Go 快速入门指南 - 数组
    概述​​数组​​​ 是具有相同数据类型的一组长度固定的数据项序列,分配在连续的内存地址上。其中数据类型可以是整型、布尔型等基础数据类型,也可以是自定义数据类型。 ​......
  • KMP算法解释:理解关于next[j]数组的求解问题
    一、算法背景介绍(我们为什么要采用这种算法?)1.补充定义:(1)主串:待匹配的大字符串(2)模式串:我们希望在主串中匹配到的字符串2.从暴力匹配到KMP算法(1)暴力匹配算法谈到KMP算法......
  • 每日算法之数组中只出现一次的两个数字
    JZ56数组中只出现一次的两个数字题目一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字思路算法实现既然有两个数......
  • 移除数组中的元素
    移除数组中的元素,双指针算法,利用元数组元素覆盖的方式,利用指针移动到指定的元素,即可一次便利实现vara=[1,2,3,4,5]vart=3varremove=(nums,t)=>{for(varf......
  • 力扣-303-区域和检索-数组不可变
    前缀和入门模板题我想着“前缀和”嘛,那就整一个“前缀和”出来,但是好像空间效率特别差感觉有点空间换时间的意思classNumArray{private: vector<int>prefixSum;pu......