树状数组laekov
lowbit
数组的第 i 位存储的是以 i 为结尾的长度为lowbit(i) 的一段的和.
int lowBit(x) { return x & -x; }
加点
int n, bt[maxn]; void btAdd(int pos, int delta) { for (; pos <= n; pos += lowBit(p)) { bt[pos] += delta; } }
查询
int btSum(int pos) { int ans = 0; for (; pos; pos -= lowBit(p)) { ans += bt[p]; } return ans; }
完整代码
略有不同的,dad曾经教给我,树状数组这么写
//线段树练习1 #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 using namespace std; int n,m,t[maxn]; void add(int k,int z) { while(k<=n) { t[k]+=z; k+=k&(-k); } } int find(int k) { int ans=0; while(k) { ans+=t[k]; k-=k&(-k); } return ans; } int main() { int i,j,k,x; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&x); add(i,x); } scanf("%d",&m); for(i=1;i<=m;i++) { int x,y,z,w; scanf("%d",&w); scanf("%d%d",&x,&y); if(w==1) add(x,y); else if(w==2) printf("%d\n",find(y)-find(x-1)); } return 0; }
//线段树练习2 #include<iostream> using namespace std; int t[100010],n,m; void add(int k,int z) { while(k<=n) { t[k]+=z; k+=k&(-k); } } int find(int a) { int ans=0; while(a) { ans+=t[a]; a-=a&(-a); } return ans; } int main() { int s; cin>>n; for(int i=1;i<=n;i++) cin>>s, add(i,s); cin>>m; for(int i=1;i<=m;i++) { int x,y,w,z; cin>>w; if(w==2) { cin>>x; cout<<find(x)-find(x-1)<<endl; } if(w==1) { cin>>x>>y>>z; for(int j=x;j<=y;j++) add(j,z); } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)