博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3468,A Simple Problem with Integers(线段树-区间查询-区间更新)
阅读量:4049 次
发布时间:2019-05-25

本文共 1847 字,大约阅读时间需要 6 分钟。

线段树的裸题。

给定N个数,有两种操作,一种使[a,b]区间内所有数加上c,另一种询问[a,b]区间内所有数的和。
代码如下:

#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=1e5+6;const int inf=0x3f3f3f3f;ll a[maxn];struct Node{ int l,r; ll lazy,sum; //lazy为更新延迟标记,sum记录当前区间的数的总和}tr[maxn<<2];void push_up(int rt) { tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;}void push_down(int rt){ tr[rt<<1].lazy+=tr[rt].lazy; //注意这里是+=,不是= tr[rt<<1|1].lazy+=tr[rt].lazy; tr[rt<<1].sum+=(tr[rt<<1].r-tr[rt<<1].l+1)*tr[rt].lazy; tr[rt<<1|1].sum+=(tr[rt<<1|1].r-tr[rt<<1|1].l+1)*tr[rt].lazy; tr[rt].lazy=0; //最后记得记得要赋值为0}void build(int rt,int l,int r){ tr[rt].l=l; tr[rt].r=r; tr[rt].lazy=0; if(tr[rt].l==tr[rt].r) { tr[rt].sum=a[l]; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); push_up(rt);}void update(int rt,int l,int r,ll val){ if(l<=tr[rt].l&&tr[rt].r<=r) { tr[rt].lazy+=val; //这里也是要+=,不是= tr[rt].sum+=(tr[rt].r-tr[rt].l+1)*val; return; } if(tr[rt].l==tr[rt].r) return; if(tr[rt].lazy) push_down(rt); int mid=(tr[rt].r+tr[rt].l)>>1; if(mid
=r) update(rt<<1,l,r,val); else { update(rt<<1,l,mid,val); update(rt<<1|1,mid+1,r,val); } push_up(rt); //最后面这个push_up别忘了}void query(int rt,int l,int r,ll &sum){ if(l<=tr[rt].l&&tr[rt].r<=r) { sum+=tr[rt].sum; return; } if(tr[rt].l==tr[rt].r) return; if(tr[rt].lazy) push_down(rt); //query函数内也要记得用push_down函数 int mid=(tr[rt].l+tr[rt].r)>>1; if(mid
=r) query(rt<<1,l,r,sum); else { query(rt<<1,l,mid,sum); query(rt<<1|1,mid+1,r,sum); }}int main(){ int n,q; while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;++i) scanf("%lld",&a[i]); build(1,1,n); while(q--) { char s[2]; int l,r; scanf("%s%d%d",s,&l,&r); if(s[0]=='Q') { ll sum=0; query(1,l,r,sum); printf("%lld\n",sum); } else { ll val; scanf("%lld",&val); update(1,l,r,val); } } } return 0;}

转载地址:http://zzdci.baihongyu.com/

你可能感兴趣的文章
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>