动态求连续区间和(树状数组模板题)
1264. 动态求连续区间和
给定 nn 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b][a,b] 的连续和。
输入格式
第一行包含两个整数 nn 和 mm,分别表示数的个数和操作次数。
第二行包含 nn 个整数,表示完整数列。
接下来 mm 行,每行包含三个整数 k,a,bk,a,b (k=0k=0,表示求子数列[a,b][a,b]的和;k=1k=1,表示第 aa 个数加 bb)。
数列从 11 开始计数。
输出格式
输出若干行数字,表示 k=0k=0 时,对应的子数列 [a,b][a,b] 的连续和。
数据范围
1≤n≤1000001≤n≤100000,
1≤m≤1000001≤m≤100000,
1≤a≤b≤n1≤a≤b≤n,
数据保证在任何时候,数列中所有元素之和均在 int 范围内。
代码:
//树状数组公式:tr[x],表示(x-lowbit(x),x)该区间的和 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=100010; int tr[N],a[N]; int n,m; int lowbit(int x){ return x&-x; } void add(int x,int v){//单点增加 for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v; } int query(int x){ int res=0; for(int i=x;i;i-=lowbit(i)) res+=tr[i];//循环的终止条件是i为0 //即达到区间的最左端 return res;//返回x的前缀和 } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); //以假设树状数组是一个个空位的方式填入原数组 //以初始化树状数组 for(int i=1;i<=n;i++) add(i,a[i]); while(m--){ int k,x,y; scanf("%d%d%d",&k,&x,&y); if(k==0) printf("%d\n",query(y)-query(x-1));//前缀和求区间 else add(x,y); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】