树状数组
2022/2/4 23:41:02
本文主要是介绍树状数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
树状数组
单点修改和区间查询
题目链接
单点修改:add(x,k)
需要一层一层向上找到父节点并修改
for(int i=x;i<=n;i+=lowbit(i))t[i]+=k;
区间查询:query(x) (快速求出前缀和)
需要一层一层向左上寻找
int res=0; for(int i=x;i;i-=lowbit(i))res+=t[i]; return res;
code
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pre(i,a,b) for(int i=(a);i>=(b);i--) #define close cin.tie(nullptr)->ios::sync_with_stdio(false) using namespace std; using ll =long long; const int N=5e5+10; int n,m; int t[N]; int lowbit(int x) { return x&-x; } void add(int x,int c) { for(int i=x;i<=n;i+= lowbit(i))t[i]+=c; } int query(int x) { int res=0; for(int i=x;i;i-= lowbit(i))res+=t[i]; return res; } void solve() { cin>>n>>m; rep(i,1,n){ int x;cin>>x; add(i,x); } while(m--) { int a,b,c; cin>>a>>b>>c; if(a==1)add(b,c); else cout<<query(c)-query(b-1)<<endl; } } int main() { close; // int _;cin>>_; // while(_--) solve(); return 0; }
区间修改和单点查询
题目链接
区间的修改 很容易想到用差分数组来实现 因此我们用树状数组来维护差分数组b[]的前缀和
区间修改 add(l,x) add(r+1,-x)
单点查询 query(x)
差分数组的前缀和是原数组 因此我们要快速查询某一个点的值只需要求差分数组的前缀和即可
code
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pre(i,a,b) for(int i=(a);i>=(b);i--) #define close cin.tie(nullptr)->ios::sync_with_stdio(false) using namespace std; using ll =long long; const int N=5e5+10; int n,m; int t[N]; int a[N],b[N]; int lowbit(int x) { return x&-x; } void add(int x,int c) { for(int i=x;i<=n;i+= lowbit(i))t[i]+=c; } int query(int x) { int res=0; for(int i=x;i;i-= lowbit(i))res+=t[i]; return res; } void solve() { cin>>n>>m; rep(i,1,n)cin>>a[i],b[i]=a[i]-a[i-1],add(i,b[i]); while(m--) { int op,x,y,k; cin>>op; if(op==1)cin>>x>>y>>k,add(x,k),add(y+1,-k); else if(op==2)cin>>x,cout<<query(x)<<endl; } } int main() { close; // int _;cin>>_; // while(_--) solve(); return 0; }
区间修改和区间查询
这篇关于树状数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27本地多文件上传的简单教程
- 2024-11-27低代码开发:初学者的简单教程
- 2024-11-27如何轻松掌握拖动排序功能
- 2024-11-27JWT入门教程:从零开始理解与实现
- 2024-11-27安能物流 All in TiDB 背后的故事与成果
- 2024-11-27低代码开发入门教程:轻松上手指南
- 2024-11-27如何轻松入门低代码应用开发
- 2024-11-27ESLint开发入门教程:从零开始使用ESLint
- 2024-11-27Npm 发布和配置入门指南
- 2024-11-27低代码应用课程:新手入门指南