树状数组-神奇的二进制

树状数组是解决快速更新以及统计数组某段区间总和,设一个数组A[1-N],需要计算A[M-K]的总和,暴力解法需要O(K-M),如果我们求出sum(1-K)和sum(1-M),那么答案就是sum(1-M)-sum(1-K);

那么如何快速求出sum(1-N),可以考虑直接求,但如果我们再加一个条件,需要即时更新,那么使用暴力解法就会出现问题,假设更新A[K],需要对sum(1-K)到sum(1-N)进行更新,这是一个非常费时的过程。

这里我们使用一种二进制的思想,我们将十进制转为二进制进行举例思考,如上图,

C[0001] = A[0001];

C[0010] = A[0010] + A[0001];

C[0011] = A[0011];

C[0100] = A[0100] + A[0011] + A[0010] + A[0001];

C[0101] = A[0101];

C[0110] = A[0110] + A[0101];

C[0111] = A[0111];

C[1000] = A[1000] + A[0111] + A[0110] + A[0101] + A[0100] + A[0011] + A[0010] + A[0001];

 把k定义为末尾连续0个数,可以理解为C[i] = A[i] + ... + A[i-2^k+1]。

更新的过程就是更新与A[i]相关的C[j],举例说明:i = 0001,j = 0001, 0010, 0100, 1000,i = 0101, j = 0110, 1000;不难看出有不断进位的规律。

求sum得过程就是求取每一位1所对应的数字的C[i]和,举例说明:

sum[1-1111] = C[1111] + C[1110] + C[1100] + C[1000];

  C[1111] = A[1111];

  C[1110] = A[1110] + A[1101];

  C[1100] = A[1100] + A[1011] + A[1010] + A[1001];

  C[1000] = A[1000] + A[0111] + A[0110] + A[0101] + A[0100] + A[0011] + A[0010] + A[0001];

了解了树状数组所具有的二进制规律,那么下来考虑如何用代码实现。

int lowbit(x) {return x&-x;
}void update(int k,int x) {for(int i=k;i<=n;i+=lowbit(i)) {C[i]+=x; }
} 

0001 -> 0010, 即 0001 + 0001 = 0010;

0010 -> 0100, 即 0010 + 0010 = 0100;

0101 -> 0110, 即 0101 + 0001 = 0110;

0110 -> 1000, 即 0110 + 0010 = 1000;

lowbit函数就是求取所加的最小进位数,x&-x可以这样理解:-x表示补码,举例可证原码&补码等于最小进位数。

更新过程就是for循环从更新的k开始,将所有C数组中相关元素更新。

int getsum(int x)
{int ans=0;for(int i=x;i;i-=lowbit(i))//i要大于0ans+=C[i];return ans;
}

1111 -> 1110, 即 1111 - 0001 = 1110;

1110 -> 1100, 即 1110 - 0010 = 1100;

1100 -> 1000, 即 1100 - 0100 = 1000;

1000 -> 0000, 即 1000 - 1000 = 0000;

同理可以看出求和是通过减去最小进位数,得到下一个需要加的值。

转载于:https://www.cnblogs.com/ACMessi/p/8469339.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通往诺贝尔奖之路:盘点10个著名的科学家族

文章 | COLIN HUNTER来源 | 科研大匠科学家们常常将最亲近的合作者当做自己的亲人看待&#xff0c;而对于有些科学家而言&#xff0c;他们的合作者就是他们的家人。无论是由于遗传因素、教育因素还是二者的综合影响&#xff0c;那些开创性的物理学研究往往是一项家庭事业。从杰…

apache php 脚本,PHP脚本不在Apache服务器上执行

问题描述我刚刚重新安装了Apache和PHP5但是当我访问我的doc root时它只下载了一个”download”文件。当我尝试documentroot /index.php时&#xff0c;它只是下载PHP文件。我安装了PHP&#xff0c;但Apache似乎不想执行它。人们建议在我的httpd.conf中添加’Load Module’线&…

20165212 预备作业3 Linux安装及学习

20165212 预备作业3Linux安装及学习 Linux虚拟机的安装过程 我像大部分同学一样&#xff0c;通过助教学姐给的Ubuntu下载地址下载映像文件、VB&#xff0c;但是屡次出现问题&#xff0c;不停的闪出一下错误提示窗口&#xff1a;在像同学求助无果之后我使用VM、Ubuntu安装了Linu…

特斯拉公布的「新电池」,究竟要用在哪里?

来源丨ArsTechnica作者丨SCOTT K. JOHNSON编译丨科技行者在近期的“电池日&#xff08;battery day&#xff09;”活动上&#xff0c;特斯拉公司终于透露了其长期保密项目的一系列惊人消息——讨论了特斯拉为自家电池组做出的全方位升级与改进&#xff0c;并宣称有望在未来三年…

matlab重叠相加法求卷积,通过重叠相加法实现卷积的报告.doc

数字信号处理课程设计题目&#xff1a;通过重叠相加法实现卷积院系&#xff1a;自动化与信息工程学院专业&#xff1a;通信工程班级: 通信091学号: 3090432028姓名: 雷帛川指导教师: 李建勋职称: 副教授2012年7月1日2012年7月14日用结构化设计方法。一个程序划分成若干模块&…

从工程文化和运维理念理解Netflix

http://www.infoq.com/cn/news/2018/01/netflix-engineering-culture 在技术圈儿&#xff0c;Netflix 是一家非常有特色的互联网公司。他们信奉“自由与责任”的企业文化&#xff0c;鼓励工程师发挥自己的爱好与特长&#xff1b;特别开放&#xff0c;很多内部系统都开源了&…

Python 程序 可以一直输入 quit_从零开始学Python - 第002课:第一个Python程序

在上一课中&#xff0c;我们已经了解了Python这门语言并安装了运行Python程序所需的环境&#xff0c;相信大家已经迫不及待的想开始自己的Python编程之旅了。首先我们来告诉大家在哪些地方可以写Python程序。编写代码的工具交互式环境我们打开Windows的“命令行提示符”工具&am…

清华张钹院士专刊文章:迈向第三代人工智能(全文收录)

来源&#xff1a;清华大学人工智能研究院作者&#xff1a;张钹、朱军、苏航在这篇评述文章中&#xff0c;清华大学人工智能研究院院长、中国科学院院士张钹教授阐述了自己对于「第三代人工智能」的看法。他认为&#xff0c;第三代 AI 发展的思路是把第一代的知识驱动和第二代的…

java 垂直走马灯多行,Android实现图文垂直跑马灯效果

最近在维护老项目&#xff0c;老项目有一个地方需要修改&#xff0c;就是垂直跑马灯的问题&#xff0c;之前的垂直跑马灯是只有文字跑马灯&#xff0c;新版需要加上。之前是用的MarqueeView&#xff0c;看了下源代码是只支持文字的&#xff0c;于是我就改了下原作者的源代码。M…

cf2.25

T1 题意&#xff1a;判断给出的数中有多少不同的大于的数。 content&#xff1a;傻逼题&#xff0c;5min手速 T2 题意&#xff1a;给出p、y&#xff0c;输出y~p1中最大一个不是2&#xff5e;p的倍数的数。 content&#xff1a;答案很简单&#xff0c;但是很难想到&#xff08;对…

惠普打印机怎么无线连接电脑_惠普打印机连不上无线?怎么解!

打印机有无线功能&#xff0c;但却总连不上路由&#xff0c;看着高大上的功能用不上&#xff0c;是不是很捉急&#xff1f;今天总结了5种打印机连接无线的方法&#xff0c;总有一款适合你~- 方 1 法 -在打印机屏幕上配置无线本方法适用于带有无线网络功能且有可视面板屏幕的打印…

matlab实验符号计算答案,实验7 Matlab符号计算.doc

实验7 Matlab符号计算实验目的&#xff1a;掌握定义符号对象的方法&#xff1b;掌握符号表达式的运算法则以及符号矩阵运算。掌握求符号函数极限及导数的方法。掌握求符号函数定积分和不定积分的方法。实验内容&#xff1a;已知x6,y5,利用符号表达式求分解因式。(1)&#xff1b…

spring framework体系结构及内部各模块jar之间的maven依赖关系

http://blog.csdn.net/qq_27093465/article/details/65660689 http://blog.csdn.net/qq_27093465/article/details/68961393转载于:https://www.cnblogs.com/hougebajie/p/8473089.html

mac 用户 文件夹 权限_Mac视频播放软件推荐

Mac上好用的视频播放器KPlayer mac是一款Mac上非常好用的视频播放器&#xff0c;这款播放器可以帮助用户观看各种高清的电影。这款KPlayer mac能够以标准和高清晰度打开和播放各类视频。通过设置H.264硬件加速&#xff0c;达到控制720p&#xff0c;1080p视频文件的渲染和播放的…

麦肯锡季刊 | 人工智能的发展与障碍

来源&#xff1a;麦肯锡作者&#xff1a;Michael Chui&#xff0c;Sankalp Malhotra受访者表示&#xff0c;人工智能正在迅速普及&#xff0c;但预计不会大规模减少企业用工人数。目前&#xff0c;仅有极少数企业具备让人工智能创造规模化价值的基本要素。麦肯锡一项以人工智能…

php7 返回值,7.6.4 函数返回值

### 7.6.4 函数返回值调用内部函数时其返回值指针作为参数传入&#xff0c;这个参数为zval *return_value&#xff0c;如果函数有返回值直接设置此指针即可&#xff0c;需要特别注意的是设置返回值时需要增加其引用计数&#xff0c;举个例子来看&#xff1a;cPHP_FUNCTION(my_f…

C#本质论pdf

下载地址&#xff1a;网盘下载内容简介 《C#本质论》是一本清晰、简明的C#教程&#xff0c;涵盖了C#2.0。书中对C#语言的每个重要结构都用简短的示例代码进行说明&#xff0c;并且和其他语言进行了全方位比较。每章开头的“思维导图”指明了本章要讨论的主题以及每个主题…

微星主板黑苹果_在老机器上LGA775平台安装黑苹果MacOS系统 – 玄烨品果

这篇算不得上是教程&#xff0c;顶多是玄烨个人心得而已。因为在装黑苹果这个技术上&#xff0c;玄烨并不是高手&#xff0c;最多是个入门的菜鸟。DSDT注入、驱动修改&#xff0c;通通都不会。能不显卡驱动好&#xff0c;网卡工作正常、声音搞定就满意了。开始分享安装过程。相…

matlab实现脑电信号的相位同步分析,视听刺激脑电信号的相位同步分析

第&#xff12;&#xff19;卷 第&#xff14;期 &#xff12;&#xff10;&#xff11;&#xff12;年 &#xff18;月              生物医学工程学杂志 &#xff2a;&#xff4f;&#xff55;&#xff52;&#xff4e;&#xff41;&#xff4c; &#xff4f;…

毕马威发布《人工智能无处不在》研究报告:人工智能在五大行业的成就与挑战...

来源&#xff1a;AIII研究院毕马威近期发布了研究报告《人工智能无处不在》。该报告对751名在人工智能各行业应用领域具有一定了解的企业决策者进行调研并发布了“成绩单”&#xff0c;总结分析了人工智能在医疗保健、金融服务、交通运输、科技、零售业五大不同行业的应用表现与…