POJ-3468-A Simple Problem with Integers(线段树区间修改+区间求和)
来源:互联网 发布:h5挂机游戏源码 编辑:程序博客网 时间:2024/05/16 23:58
与点修改的区别就是update和query的时候,增加一个add数组,update的时候修改这个add数组。如果树上一点表示的区间在要修改的区间内,那么修改他的add和sum就行,如果这个点表示的区间部分在要修改的区间外,那么将他的add下移,并更新下移区间的sum,这样一次update中最多修改2*h(h为线段树的深度)个结点的add和sum。当左右区间update结束后,修改这个区间的sum为左右两个区间的sum和。query操作同理。
#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;const int maxn=1e5+7;ll a[maxn<<2],add[maxn<<2],sum[maxn<<2];void push_down(int now,int len){ if(!add[now]) return ; add[now<<1]+=add[now]; add[now<<1|1]+=add[now]; sum[now<<1]+=add[now]*(len-(len>>1)); sum[now<<1|1]+=add[now]*(len>>1); add[now]=0;}void push_up(int now){ sum[now]=sum[now<<1]+sum[now<<1|1];}void update(int now,int l,int r,int ul,int ur,ll val){ if(ul<=l&&ur>=r) { add[now]+=val; sum[now]+=val*(r-l+1); return ; } if(l==r) return ; push_down(now,r-l+1); int mid=(l+r)>>1; if(ul<=mid) update(now<<1,l,mid,ul,ur,val); if(ur>mid) update(now<<1|1,mid+1,r,ul,ur,val); push_up(now);}void build(int now,int l,int r){ if(l==r) { add[now]=0; scanf("%I64d",&sum[now]); return ; } int mid=(l+r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); push_up(now);}ll query(int now,int l,int r,int ql,int qr){ ll res=0; int mid=(l+r)>>1; if(ql<=l&&qr>=r) return sum[now]; push_down(now,r-l+1); if(ql<=mid) res+=query(now<<1,l,mid,ql,qr); if(qr>mid) res+=query(now<<1|1,mid+1,r,ql,qr); return res;}int main(){ int n,m,l,r,c; char option[3]; while(~scanf("%d%d",&n,&m)) { build(1,1,n); for(int i=0;i<m;i++) { scanf("%s",option); if(option[0]=='Q') { scanf("%d%d",&l,&r); printf("%I64d\n",query(1,1,n,l,r)); } else if(option[0]=='C') { scanf("%d%d%d",&l,&r,&c); update(1,1,n,l,r,c); } } } return 0;}
0 0
- POJ-3468-A Simple Problem with Integers(线段树区间修改+区间求和)
- poj 3468 A Simple Problem with Integers(线段树区间修改+区间求和)
- Poj 3468 A Simple Problem with Integers (线段树 区间更新 区间求和)
- POJ 3468 A Simple Problem with Integers(线段树功能:区间加减区间求和)
- POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)
- poj 3468 A Simple Problem with Integers(线段树+区间更新+区间求和)
- poj 3468A Simple Problem with Integers 线段树 区间修改_求和
- 线段树系列-pku-3468-A Simple Problem with Integers-区间修改区间求和
- 20140719 「线段树 - 区间更新,区间求和」 POJ 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers (线段树 区间增减 区间求和)
- POJ 3468 A Simple Problem with Integers 数据结构+线段树+区间更新+区间求和
- POJ 3468 A Simple Problem with Integers(线段树区间更新+区间求和)
- POJ 3468 A Simple Problem with Integers(线段树区间更新+求和)
- poj 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
- poj 3468 A Simple Problem with Integers(线段树的区间更新与求和)
- POJ-3468-A Simple Problem with Integers (线段树 区间求和)
- POJ 3468-A Simple Problem with Integers(线段树:成段更新,区间求和)
- POJ 3468 A Simple Problem with Integers(线段树区间求和)
- git——远程仓库
- 想要学习Linux技术,先好好的读一本Linux书籍吧
- doc2vct算法实现
- 无法确定卷版本和状态CHKDSK被终止
- struts2中的exception-mapping声明时异常处理
- POJ-3468-A Simple Problem with Integers(线段树区间修改+区间求和)
- leetcode题解-49. Group Anagrams
- 我有自己的博客了
- 从https的实现看数字证书、SSL、数字签名、摘要算法、对称/非对称加密
- 树莓派3 启动蓝牙并配对
- 文章标题
- Crawler4j学习笔记-util
- 学生信息管理系统+mysql数据库的链接
- ZOJ-2165(DFS)