树状数组

树状数组倍增 ai​离散化后,第i个数出现过的次数。treei​树状数组。 阅读详情
  1. int lowbit(int t)
  2. {
  3. return t&(-t);
  4. }
  1. void add(int x,int y)
  2. {
  3. for(int i=x;i<=n;i+=lowbit(i))
  4. tree[i]+=y;
  5. }
  1. int getsum(int x)
  2. {
  3. int ans=0;
  4. for(int i=x;i>0;i-=lowbit(i))
  5. ans+=tree[i];
  6. return ans;
  7. }
     这篇笔记 会详细的讲解,使得队员们对树状数组 彻底入门  而不是懵懵懂懂。
以上先给出 最常见的,三个函数。(单点更新,区间查询)
     网上的解释以及分析有很多,这里是我的一点总结和体会归纳一下,并且在周三(2016.12.07)的讲座之后会发布在团队笔记中,
     请队员们细细阅读,并且 补题。
     下面开始
*************************************************分割线
树状数组  重点是在 树状的数组
大家都知道二叉树吧
叶子结点代表A数组A[1]~A[8]
 
 .......
现在变形一下
 现在定义每一列的顶端结点C[]数组 
 如下图
 
 
C[i]代表 子树的叶子结点的权值之和//  这里以求和举例
如图可以知道
C[1]=A[1];
C[2]=A[1]+ A[2] ;
C[3]=A[3];
C[4]= A[1]+ A[2]+A[3]+A[4] ;
C[5]=A[5];
C[6]=A[5]+A[6];
C[7]=A[7];
C[8]= A[1]+ A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8] ;
下面观察如下图
将C[]数组的结点序号转化为 二进制
1=(001)       C[1]=A[1];
2=(010)       C[2]=A[1]+ A[2] ;
3=(011)       C[3]=A[3];
4=(100)       C[4]= A[1]+ A[2]+A[3]+A[4] ;
5=(101)       C[5]=A[5];
6=(110)       C[6]=A[5]+A[6];
7=(111)       C[7]=A[7];
8=(1000)     C[8]= A[1]+ A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8] ;
对照式子可以发现  C[i]=A[i-2^k+1]+A[i-2^k+2]+......A[i]; (k为i的二进制中从最低位到高位连续零的长度)例如i=8时,k=3;
可以自行带入验证;
现在引入lowbit(x) 
lowbit(x) 其实就是取出x的最低位1  换言之  lowbit(x)=2^k  k的含义与上面相同 理解一下
下面说代码
  1. int lowbit(int t)
  2. {
  3. return t&(-t);
  4. }
  5. //-t 代表t的负数 计算机中负数使用对应的正数的补码来表示
  6. //例如 :
  7. // t=6(0110) 此时 k=1
  8. //-t=-6=(1001+1)=(1010)
  9. // t&(-t)=(0010)=2=2^1
C[i]=A[i-2^k+1]+A[i-2^k+2]+......A[i];
C[i]=A[i-lowbit(i)+1]+A[i-lowbit(i)+2]+......A[i];
 
*************************************************分割线
区间查询
ok 下面利用C[i]数组,求A数组中前i项的和 
举个例子 i=7;
sum[7]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7] ;   前i项和
C[4]= A[1]+ A[2]+A[3]+A[4] ;    C[6]=A[5]+A[6];    C[7]=A[7];
可以推出:    sum[7]=C[4]+C[6]+C[7];
序号写为二进制: sum[(111)]= C[(100)]+C[(110)]+C[(111)];
 
再举个例子 i=5
sum[7]=A[1]+A[2]+A[3]+A[4]+A[5] ;   前i项和
C[4]= A[1]+ A[2]+A[3]+A[4] ;   C[5]=A[5];
可以推出:    sum[5]=C[4]+C[5];
序号写为二进制: sum[(101)]= C[(100)]+C[(101)];
 
细细观察二进制 树状数组追其根本就是二进制的应用
结合代码
  1. int getsum(int x)
  2. {
  3. int ans=0;
  4. for(int i=x;i>0;i-=lowbit(i))
  5. ans+=C[i];
  6. return ans;
  7. }
对于i=7 进行演示 
                                  7(111)           ans+=C[7]
lowbit(7)=001  7- lowbit(7)=6(110)    ans+=C[6]
lowbit(6)=010  6-lowbit(6)=4(100)    ans+=C[4]
lowbit(4)=100  4-lowbit(4)=0(000)    
对于i=5 进行演示 
                                  5(101)            ans+=C[5]
lowbit(5)=001  5- lowbit(5)=4(100)    ans+=C[4]
lowbit(4)=100  4-lowbit(4)=0(000)    
 
*************************************************分割线
单点更新
 
当我们修改A[]数组中的某一个值时  应当如何更新C[]数组呢?
回想一下 区间查询的过程,再看一下上文中列出的图
 
结合代码分析
  1. void add(int x,int y)
  2. {
  3. for(int i=x;i<=n;i+=lowbit(i))
  4. tree[i]+=y;
  5. }
  6. //可以发现 更新过程是查询过程的逆过程
  7. //由叶子结点向上更新C[]数组
 
如图: 
当更新A[1]时  需要向上更新C[1] ,C[2],C[4],C[8]
                     C[1],   C[2],    C[4],     C[8]
写为二进制   C[(001)],C[(010)],C[(100)],C[(1000)]
                                      1(001)        C[1]+=A[1]
lowbit(1)=001 1+lowbit(1)=2(010)      C[2]+=A[1]
lowbit(2)=010 2+lowbit(2)=4(100)     C[4] +=A[1]
lowbit(4)=100 4+lowbit(4)=8(1000)   C[8] +=A[1]
 
*************************************************分割线
先这样 
讲解题目:
树状数组详解 树状数据结构,通常维护一些带有差分性质的区间问题,比如单点加,单点乘,查询区间和,前后缀最大值、最小值等。线段树得以快速修改和查询在于下传懒标记,而树状数组则是每次修改时,将标记上传,查询的时候不用像线段树一样每次 。区别之处在于标记传送的方式的不同。树状数组的图示: 和线段树不同,我们定义一个点,其儿子的范围(就是存的哪一个区间的范围)是 [i−2k+1,i][i-2^k+1,i][i−2k+1,i] 其中 kkk 是 iii 二进制下从后往前第一个为 111 的位置,下标从0开始计算,我们称这个值为 l 阅读详情

相关推荐

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

树状数组学习

int lowbit(int t){return t&(-t);} void add(int x,int y){for(int i=x;in;i+=lowbit(i))tree[i]+=y;} int getsum(int x){int ans=0;for(int i=x;i>0;i-=lowbit(i))ans+=tree[i];return ans;}

zpf_nevergiveup的博客 529

通过TMS320F28335学习DSP的开发流程——28335的基础知识(1)

1、TMS320F28335内核的主要特点 ①F28335 DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28335能够在一个周期内完成32x32位的乘法累加运算,或者两个16x16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成 ②快速的中断响应 ③可在任何内存位置进行单周期读、修改、写操作 ④可采用C/C++编程软件,效率非常高 2、处理器的主要资源 ①32位浮点DSP,主频是150MHz,方便电机控制、电力设备控制及工业控制等。 ②片上存储器:FLASH–

Kayboy的博客 2万+

读书笔记-数论

离散数学之数论 翻了翻课本,看到数论一章有一个问题:20!的二进制表示从最低位数起有多少个连续的 0 。 课本上直接求 1到20的数 含有因子2的个数和,求出来是 18. 各种不理解,然后百度。看到了《编程之美》一书有同样的问题。 以下内容部分摘自: 大神的读书笔记有两个问题,用到的方法类似 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N

你记不住我 638

ANSYS APDL 异类单元连接实战:MPC方法在壳-实体装配中的应用

本文详细介绍了在ANSYS APDL中使用MPC方法实现壳单元与实体单元高效连接的技术要点。通过分析工程仿真中的常见需求,阐述了MPC方法在解决异类单元连接问题上的优势,包括网格独立性、自由度耦合和载荷传递等特性,并提供了具体的APDL命令流操作示例和实用经验技巧。

weixin_33391446的博客 178

高速DAC时钟与配置实战:DAC5681Z硬件设计与寄存器编程详解

在高速数据转换系统中,时钟信号是决定系统性能的核心要素,其稳定性和纯净度直接影响数模转换器(DAC)的输出频谱纯度与动态范围。时钟电路的设计原理涉及信号完整性、阻抗匹配与直流偏置,而内部锁相环(PLL)和延迟锁相环(DLL)的配置则是实现精确时序控制的关键技术。这些技术的价值在于,它们共同保障了高速通信、雷达和任意波形生成等应用对信号实时性与精度的严苛要求。本文聚焦于德州仪器(TI)的DAC5681Z,深入解析其外部时钟输入电路的硬件设计要点,包括端接电阻的计算与选型,并详细拆解通过串行外设接口(SPI)对

weixin_30342363的博客 186

树状数组(详细分析+应用),看不懂打死我!

树状数组介绍 在学习一个算法之前一定要清楚它能干嘛,能解决什么样的问题,对你解题是否有帮助,然后才去学习它! 那么接下来看如下几个问题 什么是树状数组 顾名思义就是一个结构为树形结构的数组,于二叉树的结构类似但又不同,它是在二叉树的结构上删除了一些中间节点,来看两幅图就明白了. 1.这是二叉树的结构 2.这是树状数组的结构 不难发现,树状数组相比于二叉树删除了一些节点,但是为什么要删除呢?这就和树状数组的一些性质(lowbit)有关了,不懂没关系,继续往下看. 树状数组可以解决什么问题呢? 可以解决大部

TheWayForDream 8万+

opencv 双目摄像头拍照(分别左右镜头拍照)

准备一个usb线的双目同步摄像头: 运行环境是vc2015,opencv3.1。 将左右两个摄像头拍到的图片分别保存起来。 1)适用条件 双目同步摄像头(两个镜头,共用一个设备ID) 使用语言:C++ 、opencv库 摄像头 分辨率2560*960 或以上。 源程序: #include"stdafx.h" #include<iostream&g...

黎国溥 1万+

树状数组(超详细)

树状数组千字精华讲解

Jiguoyuanyic的博客 4228

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

手把手教你学simulink(16.10)-- 基于Simulink的IIR滤波器(Infinite Impulse Response Filter)项目

基于Simulink的IIR滤波器(Infinite Impulse Response Filter)项目的详细实例介绍。这个项目将重点放在IIR滤波器的设计、实现和仿真上,帮助你理解和应用IIR滤波器在信号处理中的作用。

MHD0815的博客 706

树状数组——原理详解

简单来说,这是一种数据结构。顾名思义,它通过树的结构来对数组进行高效操作,一般用于求数组前缀和以及区间和,并且可以在线维护数组,时间复杂度为OlogNO(logN)OlogN。lowbitxlowbit(x)lowbitx表示xxx在二进制下从右往左第一个111所代表的权值lowbit510lowbit101212110lowbit510​lowbit1012​12​。

2405_87814990的博客 1901

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

树状数组总结

声明:该文章同步发表于。从名字上来看,树状数组就是一个形状像树的数组。二叉树和树状数组结构对比图:可以发现树状数组虽然和二叉树结构相近,但是删除了一部分。为什么呢?再给出另一张结构图:可以发现,每一层中的第偶数个格子是无用的,第奇数个格子是有用的,这是因为,对于第层第个格子(),一定可以用第层第个格子减去第层第个格子得到。那么怎么求解呢?我们用维护一个树状数组。初始化:是不是挺麻烦的?没错!我们可以用前缀和计算,记为。得出结论:Q:函数是干什么的?

ATION001的博客 966

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

树状数组-树状数组模板

如题,已知一个数列,你需要进行下面两种操作: - 将某一个数加上 $x$。 - 求出某区间每一个数的和。

nick_912912的博客 1046

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

树状数组笔记

代码源数据结构中级课 第一课:树状数组笔记 目录树状数组1树状数组2逆序对2树状数组二分二维树状数组 树状数组1 思路:lowbitlowbitlowbit:求二进制数最低位111和尾端000构成的二进制数,lowbit(x)=x&(−x)lowbit(x)=x\&(-x)lowbit(x)=x&(−x) 树状数组ci=∑j=i−lowbit(i)+1iajc_i=\sum_{j=i-lowbit(i)+1}^ia_{j}ci​=∑j=i−lowbit(i)+1i​aj​ 单点加:

qq_53287227的博客 1892

树状数组 java_树状数组详解

先来看几个问题吧。1.什么是树状数组?顾名思义,就是用数组来模拟树形结构呗。那么衍生出一个问题,为什么不直接建树?答案是没必要,因为树状数组能处理的问题就没必要建树。和Trie树的构造方式有类似之处。2.树状数组可以解决什么问题可以解决大部分基于区间上的更新以及求和问题。3.树状数组和线段树的区别在哪里树状数组可以解决的问题都可以用线段树解决,这两者的区别在哪里呢?树状数组的系数要少很多,就比如字...

weixin_42220669的博客 1574

【C++】树状数组

什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗。那么衍生出一个问题,为什么不直接建树?答案是没必要,因为树状数组能处理的问题就没必要建树。和Trie树的构造方式有类似之处。 树状数组可以解决什么问题? 可以解决大部分基于区间上的更新以及求和问题。 树状数组和线段树的区别在哪里? 树状数组可以解决的问题都可以用线段树解决,这两者的区别在哪里呢?树状数组的系数要少很多,就比如字符串模拟大数可以...

Ljnoit 1276

树状数组求解逆序对个数(含树状数组的入门)

树状数组(含lowbit的证明)一.树状数组介绍 在学习树状数组之前,我们要先探究4个问题。 1. 什么是树状数组? 见名知意,就是用数组来模拟树形结构。那么又衍生出一个问题,为什么不直接建树呢?这个问题的答案是没有必要,树状数组就可以解决的问题没必要建树。 2. 用来解决什么问题? 和线段树一样用来解决区间上的更新、求和等操作。 3.和线段树有什么区别 其实树状数组可以解决的问题线段树都可以解决,但是树状数组的系数要少很多。 4.优缺点 优点是:修改和查询的时间复杂度都是O(logN),系数要比线段树少许

hahahahahaha5的博客 1201

【树状数组】学习树状数组

我在网上搜索到一些优秀的博客学习的树状数组,以下是参考的博客: 一维树状数组 搞懂树状数组:点击打开链接 树状数组学习笔记:点击打开链接 完全认识树状数组:点击打开链接 还有算法训练指南中的讲解; 以上的链接是关于树状数组的原理讲解; 随着时间可能会忘记,可以画一个图解便于理解(训练指南上的图解比较好!) //心得: 刚开始用树状数组写题的时候,不知道如何下手。这个树状数

Hi_jiaxinwei的博客 523
上一篇: 威佐夫博弈详解
下一篇: 尼姆博弈整理
FDOM
博客等级 码龄10年 4粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值