由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val;

但是我们为了把懒标记打上,当节点表示的区间是完全被询问区间包含,那么这个区间的信息都是有用的,因此我们其实只需要把这个节点更新,并打上懒标记即可。如果以后update 或者 query 需要跑到下面,直接往下pushdown即可。

pushdown的时候,由于当前层的信息已经更新,我们需要把信息往下推,并把子节点的信息维护,因此需要把laze标记往下打,并且往下更新修改即可

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = ;
long long sum;
inline int L(int r)
{
return r<<;
}
inline int R(int r)
{
return r<<|;
}
inline int MID(int l,int r)
{
return (l+r)>>;
}
struct node
{
int left,right;
long long val,add;
} tree[maxn<<];
long long b[maxn];
void pushdown(int root)
{
if (tree[root].add) //这个节点内部需要往下更新
{
tree[L(root)].add+=tree[root].add;//把laze标记往下传递 以后再进行更深的节点
tree[R(root)].add+=tree[root].add;
tree[L(root)].val+=(tree[L(root)].right-tree[L(root)].left+)*tree[root].add;//laze标记应该标记在自己的本身的位置 去改变下一个位置
tree[R(root)].val+=(tree[R(root)].right-tree[R(root)].left+)*tree[root].add;
tree[root].add=;//消除标记
}
}
void buildtree(int root,int l,int r)
{
tree[root].left=l;
tree[root].right=r;
tree[root].add=;
if(l==r)
{
tree[root].val=b[l];
return;
}
int mid=MID(l,r);
buildtree(L(root),l,mid);
buildtree(R(root),mid+,r);
tree[root].val=tree[L(root)].val+tree[R(root)].val;
}
void update(int root,int l,int r,long long v)
{
if(l<=tree[root].left && tree[root].right<=r)//包含在询问的区间内部
{
tree[root].add+=v;//打上标记
tree[root].val+=v*(tree[root].right-tree[root].left+);//修改
return;
}
pushdown(root);
if(tree[root].left==tree[root].right)
{
return;
}
int mid=MID(tree[root].left,tree[root].right);
if(l>mid)
update(R(root),l,r,v);//左区区间仅仅在右儿子节点中
else if (r<=mid)update(L(root),l,r,v);//仅仅在左儿子节点中
else
{
update(L(root),l,mid,v);//继续向下询问
update(R(root),mid+,r,v);//继续向下询问
}
tree[root].val=tree[L(root)].val+tree[R(root)].val;//把更新往上修改
}
void query(int root,int l,int r)
{
if (l<=tree[root].left && tree[root].right<=r)
{
sum+=tree[root].val;
return;
}
pushdown(root);
if(tree[root].left==tree[root].right)return;
int mid=MID(tree[root].left,tree[root].right);
if (l>mid)query(R(root),l,r);
else if (r<=mid)query(L(root),l,r);
else
{
query(L(root),l,mid);
query(R(root),mid+,r);
}
}
int main()
{
int n,m;
char op;
int tmp1,tmp2;
long long tmp3;
while(~scanf("%d%d",&n,&m))
{
for (int i=; i<=n; i++)
{
scanf("%lld",&b[i]);
}
buildtree(,,n);
while(m--)
{
scanf(" %c",&op);
if (op=='Q')
{
scanf("%d%d",&tmp1,&tmp2);
sum=;
query(,tmp1,tmp2);
printf("%lld\n",sum);
}
else
{
scanf("%d%d%lld",&tmp1,&tmp2,&tmp3);
update(,tmp1,tmp2,tmp3);
}
}
}
return ;
}

POJ - 3468 线段树区间修改,区间求和的更多相关文章

  1. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

  2. POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)

    题意: 给定一个数字n,表示这段区间的总长度.然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c 思路: 线段树首先就是递归建 ...

  3. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

  4. poj 3468 线段树 成段增减 区间求和

    题意:Q是询问区间和,C是在区间内每个节点加上一个值 Sample Input 10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4Sample O ...

  5. POJ 3468 线段树区间修改查询(Java,c++实现)

    POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...

  6. hdu 1698+poj 3468 (线段树 区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...

  7. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  9. POJ 3468 (线段树 区间增减) A Simple Problem with Integers

    这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...

  10. POJ 3468<线段树,区间add>

    题目连接 //位运算 k<<1 相当于 k*2 k<<1|1 相当于 k*2+1 /* 修改区间内的值,并且维护区间和. 详见代码 */ #include<cstdio& ...

随机推荐

  1. 分布式:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  2. 【公众号系列】SAP S/4 HANA 1809请查收

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP S/4 HANA 1809 ...

  3. mac os 10.12 Sierra 连接 惠普 M1136 MFP 打印机,通过 samba 协议,安装驱动,连接打印机

    参考链接: https://support.hp.com/hk-zh/product/hp-zbook-17-g3-mobile-workstation/8693765/document/c04530 ...

  4. Kali 2.0 Web后门工具----WebaCoo、weevely、PHP Meterpreter

    注:以下内容仅供学习使用,其他行为均与作者无关!转载请注明出处,谢谢! 本文将介绍 Kali 2.0 版本下的三款Web后门工具:WebaCoo.weevely.PHP Meterpreter,这类工 ...

  5. 使用google的pprof工具以及在gin中集成pprof

    首先我们得先安装这两个工具: google的pprof工具链 go get -u github.com/google/pprof gin的pprof工具 go get github.com/DeanT ...

  6. Nginx 安装配置

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

  7. mysql数据权限的分配

    在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你 ...

  8. CUDA Fortran for Scientists and Engineers第二版翻译

          下午听朋友说,NV把<CUDA Fortran for Scientists and Engineers>的出版权卖给了国内某出版商.第一反应是我们三翻译的岂不是白翻译了.第二 ...

  9. WPF之DataGrid应用 翻页

    前几天打算尝试下DataGrid的用法,起初以为应该很简单,可后来被各种使用方法和功能实现所折磨.网络上的解决方法太多,但也太杂.没法子,我只好硬着头皮阅览各种文献资料,然后不断的去尝试,总算小有成果 ...

  10. 转://Oracle undo 自动调优

    Oracle 10gr2的后续版本中添加了UNDO信息最短保留时间段自动调优的特性,不再仅仅依据参数UNDO_RETENTION的设定,其调优原则如下:1. 当UNDO TABLESPACE为 fix ...