树状数组的简单思想

阿拉德有上百万人,当地统计人口的官员阿库娅处理不过来惹。。
上百万人这个数量,就算只记名字到书上,也不方便储存,更别说查找了(枚举)。
给这些人编号1-n,为这些人的名字,每个人都有一个工资k,想知道从名字为1-m的连续区间内总工资共有多少;(计算地区GDP)
阿库娅连夜赶马车走的
聪明的阿库娅想到一个方法,建立分级管理制度,大家既然名字都是数字,自然对二进制很熟悉,让一些人管理另一些人,一层一层直到最后n;
被管理的人有特征:假设被管理人为k,管理他的人就是k+lowbit(k)
对每个数,k+lowbit(k)是他的管理员,每个人只有一个顶头上司,

是不是管理员还得看自己脸好不好,别人要向你进位,你就是管理员
比如64,1-63都得向他进位,他管着1-63的和,而75就比较惨了,没人向他进位,就知道自己的(数字大也没用嘛)

/ / / / / / / /QAQ: 那现在问1-m的人总收入为多少呀?
睿智如阿库娅一摆手:去找各个管理员吧
QAQ:可是那么多人,怎么知道说管理者谁呢?
阿库娅:不是每个数的管理员都是向上进位嘛,m=2^a +2^b…+2 ^h
会发现【 2^ a保存着1-2^a的和,2 ^a+2 ^b保存着2 ^a - 2 ^b的和,依次类推】
,那1-m的和,就是(2^ a)+(2^ a+2^ b)+…+(2^ a+2^ b+2^ h)
PS:这里括号是指管理的总值,并非数字本身

QUQ:我明白了,每次降位(去掉二进制最后一位)的管理员依次掌管着从(再降一位+1,)到这次降位的值之间的信息,把这些区间加起来就是1-m之间的总和,你真是太睿智了!不说了我去找管理员了
阿库娅:哎?你知道怎么降位?
QAQ:m-lowbit(m);lowbit(m)=(-m)&m;
二进制中,-m是m取反再加上1,加一会使与m最低位相对应的位置置1,那么m&(-m)就等于取了m最低位,然后把它减去就是降位了,也就是lowbit!
阿库娅眯起了眼睛开始睡午觉~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值