E - 树状数组 1【GDUT_22级寒假训练专题五】
E - 树状数组 1
题意
已知一个数列,你需要进行下面两种操作:
将某一个数加上 \(x\)
求出某区间每一个数的和
lowbit函数
定义一个函数\(f=lowbit(x)\),这个函数的值是\(x\)的二进制表达式中只保留最低位\(1\)得到的十进制数
比如:
\]
那么\(lowbit(6)\)就等于\(2\),因为\((110)_2\)中最低位(就是从右往左数的第二位)对应的数是\((10)_2=(2)_{10}\)
所以假设一个数的二进制最低位的1在从右往左数的第k位,那么它的lowbit值就是
\]
int lowbit(int x){
return x & -x;
}
原理:
根据计算机补码的性质。
补码就是原码的反码加一
如:
\]
反码:
\]
加一:
\]
可以发现变为反码后 x 与反码数字位每一位都不同, 当反码加1,反码会逢1一直进位直到遇到0,且这个0变成了1,所以这个数最后面构造了一个 100… 串。 只有一个\(1\),因此进行&运算后除了该位上存在\(1\),其他位都是\(0\)(反码的最低位\(0\)变成\(1\),与反码取反前的原码相同都是\(1\)),进而得到二进制表达式中只保留最低位\(1\)得到的十进制数
树状数组的定义
树状数组是一种维护前缀和的数据结构,可以实现 \(O(\log{n})\)查询一个前缀的和,\(O(\log{n})\)对原数列的一个位置进行修改。
- 与前缀和相同的是,树状数组使用与原数列大小相同的数组即可维护
- 与前缀和不同的是,树状数组的一个位置 i 存储的是从 i 开始,(包括 i)向前\(t_i\)个元素的和
\(t_i\)就是最大的可以整除 \(i\) 的\(2\)的幂(通过上述\(lowbit\)函数可以得到)
树状数组的性质
设树状数组为b
性质1:有上述定义得到$b[k] = \sum_{k-lowbit(k)+1}^{k} $
性质2:父节点 \(b[dad] = b[k] + lowbit(k)\)
(上为树状数组b,下为原数组a)
树状数组单点修改
根据性质2可以改造出对树状数组单点修改的函数
\(add(int \ k,int \ x)\)功能:下标为k的增加x
void add(int k,int x){
while(k <= n){ //不能超范围
b[k] += x;
k += lowbit(k); //维护父节点
}
}
注意:空数组本身就是一个树状数组(和均为0),因此原数组输入数据维护树状数组b时可以直接\(add(i,a_i)\)
树状数组区间查询
作差求lr的区间和:sum[1r] - sum[1~l-1]
根据性质1:
LL getsum(int l,int r){
l --;
LL s1 = 0;
while(l){
s1 += b[l];
l -= lowbit(l);
}
LL s2 = 0;
while(r){
s2 += b[r];
r -= lowbit(r);
}
return s2 - s1;
}
最终代码
点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
#define X first
#define Y second
typedef pair<int,int> pii;
typedef long long LL;
const char nl = '\n';
const int N = 1e6+10;
const int M = 2e5+10;
int n,m;
int a,b[N];
int lowbit(int x){
return x & -x;
}
void add(int k,int x){
while(k <= n){
b[k] += x;
k += lowbit(k);
}
}
LL getsum(int l,int r){
l --;
LL s1 = 0;
while(l){
s1 += b[l];
l -= lowbit(l);
}
LL s2 = 0;
while(r){
s2 += b[r];
r -= lowbit(r);
}
return s2 - s1;
}
void solve(){
cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
cin >> a;
add(i,a);
}
while(m -- ){
int op;
cin >> op;
if(op == 1){
int k,x;
cin >> k >> x;
add(k,x);
}
else{
int l,r;
cin >> l >> r;
cout << getsum(l,r) << nl;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
}
E - 树状数组 1【GDUT_22级寒假训练专题五】的更多相关文章
- 2018年全国多校算法寒假训练营练习比赛(第五场):A题:逆序数(树状数组or归并排序)
题目描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.比如一个序列为4 5 1 3 2, 那么这个序列 ...
- 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)
https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...
- HZNU-ACM寒假集训Day5小结 线段树 树状数组
线段树 什么时候用线段树 1.统计量可合并 2.修改量可合并 3.通过统计量可直接修改统计量 一句话:满足区间加法即可使用线段树维护信息 理解Lazy Tage 蓝色是要把信息及时维护的节点,红色是本 ...
- 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)
在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...
- POJ 2352Stars 树状数组
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42898 Accepted: 18664 Descripti ...
- 51Node 1364--- 最大字典序排列(树状数组)
51Node 1364--- 最大字典序排列(树状数组) 1364 最大字典序排列 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 给出一个1至N ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...
- POJ3321 Apple Tree (树状数组)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16180 Accepted: 4836 Descr ...
- PHP利用递归法获取多级类别的树状数组
数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...
随机推荐
- 抓包整理————ip 协议四[十五]
前言 简单了解一下ip 协议选路问题. 正文 比如host1 到 host2是直接传输,因为host1和 host2 是同一交换机,直接arp表知道对方的mac. 第二种是他们是不同网段之间通信. 第 ...
- 视觉享受,兼顾人文观感和几何特征的字体「GitHub 热点速览 v.22.46」
GitHub 上开源的字体不在少数,但是支持汉字以及其他非英文语言的字体少之又少,记得上一个字体还是 霞鹜文楷,本周 B 站知名设计 UP 主开源了的得意黑体在人文观感和几何特征之间找到了美的平衡. ...
- sqlserver数据库还原
这里是从A服务器备份的数据库文件,还原到本地B电脑的数据库.因数据库版本相同,故而未曾出现其他版本问题 1.有个bak的备份文件 2.在B电脑新建一个数据库test. 3.设置test数据库的访问限制 ...
- win 10玩魔兽争霸/黑边,不能全屏,闪退
1.win键+s键搜索注册表 打开 找到路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Blizzard Entertainment\Warcraft III\Video 这里有两 ...
- 5 STL-string
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...
- [论文阅读] 颜色迁移-N维pdf迁移
[论文阅读] 颜色迁移-N维pdf迁移 文章: N-Dimensional Probability Density Function Transfer and its Application to C ...
- day35-JSON&Ajax03
JSON&Ajax03 4.jQuery的Ajax请求 原生Ajax请求问题分析: 编写原生的Ajax要写很多的代码,还要考虑浏览器兼容问题,使用不方便 在实际工作中,一般使用JavaScri ...
- C++进阶(位图+布隆过滤器的概念和实现+海量数据处理)
位图 概念 位图: 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景.通常是用来判断某个数据存不存在的. 适用场景: 如果我们需要对大量的数据进行处理,判断该数据在不在,比如40 ...
- Linux基础:ssh与scp
登陆 登陆服务器 ssh user@hostname user: 用户名 hostname :IP地址或域名 第一次登陆会提示 The authenticity of host '123.57.47. ...
- CentOS7升级Linux内核
CentOS7升级Linux内核 什么是Linux内核 虽然时候使用 Linux 来表示整个操作系统,严格地说,Linux 只是个内核,而发行版的操作系统是一个完整功能的系统,它建立在内核之上,具有各 ...