线段树模板
来源:互联网 发布:萨德对中国的影响 知乎 编辑:程序博客网 时间:2024/06/10 16:32
区间修改+区间查询
#include <iostream>#include <cstdio>using namespace std;typedef long long LL;const int MAXN=100000+10;LL sum[MAXN<<2],Add[MAXN<<2];//注意数组要开成n*4大小;LL A[MAXN];int n,m,n1,x1,y1,k1;void Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[(rt<<1)|1]; }void Pushdown(int rt,int ln,int rn){ if(Add[rt]) { sum[rt<<1]+=Add[rt]*ln; sum[(rt<<1)|1]+=Add[rt]*rn; Add[rt<<1]+=Add[rt]; //下放标记的时候注意加的时Add[rt]; Add[(rt<<1)|1]+=Add[rt]; Add[rt]=0; }}void build(int l,int r,int rt){ if(l==r) { sum[rt]=A[l]; return ; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,(rt<<1)|1); Pushup(rt);//要更新当前}void updata(int L,int R,int C,int l,int r,int rt) //区间修改{ if(L<=l&&R>=r) { Add[rt]+=C; sum[rt]+=C*(r-l+1); return ; } int m=(l+r)>>1; Pushdown(rt,m-l+1,r-m); //每到一个节点就要下放标记 if(L<=m) updata(L,R,C,l,m,rt<<1); if(R>m) updata(L,R,C,m+1,r,(rt<<1)|1); Pushup(rt);//注意}LL Query(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) { return sum[rt]; } int m=(l+r)>>1; //!!! Pushdown(rt,m-l+1,r-m); //每到一个节点就下放标记; LL ans=0; if(L<=m) ans+=Query(L,R,l,m,rt<<1); if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1); return ans;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&A[i]); build(1,n,1); for(int i=1;i<=m;i++) { scanf("%d",&n1); if(n1==1) { scanf("%d%d%d",&x1,&y1,&k1); updata(x1,y1,k1,1,n,1); } else { scanf("%d%d",&x1,&y1); printf("%lld\n",Query(x1,y1,1,n,1)); } } return 0; }
单点修改+区间查询
#include <iostream>#include <cstdio>using namespace std;const int MAXN=100000+10;int sum[MAXN<<2];int A[MAXN],n,m;int num,x1,y1,k;void Pushup(int rt) {sum[rt]=sum[rt<<1]+sum[(rt<<1)|1];}void build(int l,int r,int rt){ if(l==r) { sum[rt]=A[l]; return ; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,(rt<<1)|1); Pushup(rt);//要更新当前节点}void updata(int L,int C,int l,int r,int rt){ if(l==r) { sum[rt]+=C; return ; } int m=(l+r)>>1; if(L<=m) updata(L,C,l,m,rt<<1); else updata(L,C,m+1,r,(rt<<1)|1); Pushup(rt);//更新当前节点}int Query(int L,int R,int l,int r,int rt){ if(L<=l&&R>=r) { return sum[rt]; } int m=(l+r)>>1; int ans=0; if(L<=m) ans+=Query(L,R,l,m,rt<<1); if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1); return ans;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&A[i]); build(1,n,1); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&x1,&y1,&k); if(x1==1) updata(y1,k,1,n,1); else printf("%d\n",Query(y1,k,1,n,1)); } return 0;}
0 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 机器人的指令
- LeetCode Summary Linked List
- java多线程常用的类
- 全面解析Android EditText以及软键盘的设置
- Python知识点备忘(1)
- 线段树模板
- 安卓学习随笔(1)
- KMP水题
- LeetCode Summary Math
- Servlet拦截静态图片的解决方案
- leetcode_middle_36_436. Find Right Interval
- 设置resin在linux下的默认启动
- lacp协议文档概要
- LeetCode Summary Search