题目链接:http://poj.org/problem?id=3468

思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个合适的范围就用一个增量来记录它,当下一次询问时,如果这个范围正好合适询问的范围,就直接是这个节点的sum值加上这个区间长度*lnc,再加到总和上去,若这个节点的范围不适合所要查询的范围,那么就要查询它的子节点,这个时候再把增量传给她的子节点,并且清空父亲节点的增量,这样效率能大大提高。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100010
typedef long long ll; struct Node{
int L,R;
ll lnc;//增量
ll sum;
}node[MAXN<<]; int N,Q; void Build(int L,int R,int rt)
{
if(L==R){
node[rt].lnc=node[rt].sum=;
return ;
}
node[rt].lnc=node[rt].sum=;
int M=(L+R)>>;
Build(L,M,rt<<);
Build(M+,R,(rt<<)|);
} void Updata(int L,int R,int rt,int id,ll x)
{
if(L==id&&R==id){
node[rt].sum=x;
return ;
}
node[rt].sum+=x;
int M=(L+R)>>;
if(id<=M){
Updata(L,M,rt<<,id,x);
}else
Updata(M+,R,(rt<<)|,id,x);
} void Add_Updata(int L,int R,int rt,int l,int r,ll x)
{
if(l<=L&&R<=r){
node[rt].lnc+=x;//若此节点所在区段被包含在要插入的区段中,就将插入值存在lnc中,return;
return ;
}else if(L<=l&&r<=R){
node[rt].sum+=(r-l+)*x;
}else if(L>=l&&R>=r){
node[rt].sum+=(r-L+)*x;
}else if(L<=l&&R<=r){
node[rt].sum+=(R-l+)*x;
}
int M=(L+R)>>;
if(r<=M){
Add_Updata(L,M,rt<<,l,r,x);
}else if(l>M){
Add_Updata(M+,R,(rt<<)|,l,r,x);
}else {
Add_Updata(L,M,rt<<,l,r,x);
Add_Updata(M+,R,(rt<<)|,l,r,x);
}
} ll sum;
void Query(int L,int R,int rt,int l,int r)
{
if(l<=L&&R<=r){
sum+=node[rt].sum+node[rt].lnc*(R-L+);
return ;
}
//若上面if条件不成立,则要询问它的子节点,此时增量要下传,并且要更新其本身的sum;
node[rt<<].lnc+=node[rt].lnc;
node[(rt<<)|].lnc+=node[rt].lnc;
node[rt].sum+=node[rt].lnc*(R-L+);
node[rt].lnc=;
int M=(L+R)>>;
if(r<=M){
Query(L,M,rt<<,l,r);
}else if(l>M){
Query(M+,R,(rt<<)|,l,r);
}else {
Query(L,M,rt<<,l,r);
Query(M+,R,(rt<<)|,l,r);
}
} int main()
{
int a,b,c;
char str[];
scanf("%d%d",&N,&Q);
Build(,N,);
for(int i=;i<=N;i++){
scanf("%d",&a);
Updata(,N,,i,(ll)a);
}
while(Q--){
scanf("%s",str);
if(str[]=='Q'){
scanf("%d%d",&a,&b);
sum=;
Query(,N,,a,b);
printf("%lld\n",sum);
}else {
scanf("%d%d%d",&a,&b,&c);
Add_Updata(,N,,a,b,(ll)c);
}
}
return ;
}

poj 3468(线段树+lazy思想)的更多相关文章

  1. poj 2777(线段树+lazy思想) 小小粉刷匠

    http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...

  2. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

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

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

  4. poj 3468(线段树)

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

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

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

  6. POJ 3468 线段树+状压

    题意:给你n个数,有对区间的加减操作,问某个区间的和是多少. 思路:状压+线段树(要用lazy标记,否则会TLE) //By SiriusRen #include <cstdio> #in ...

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

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

  8. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

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

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

随机推荐

  1. hdu 3288 Resource Allocation

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3288 Resource Allocation Description HDU-Sailormoon i ...

  2. Linux下Nginx的安装与配置

    安装前需要安装pcre:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/1.解压缩:     tar xjpf pcre-7.8.tar.b ...

  3. Object C学习笔记2-NSLog 格式化输出数据

    1 . 几种常用类型变量声明 int i =10; BOOL isShow=YES; BOOL isShow=1; float f = 3.1415926; char a =120; NSString ...

  4. Call C# in powershell

    How to call C# code in powershell Powershell Command Add-Type usage of Add-Type we use Add-Type -Typ ...

  5. 68.vivado与modelsim的关联以及器件库编译

    vivado软件中也自带仿真工具,但用了几天之后感觉仿真速度有点慢,至少比modelsim慢挺多的.而modelsim是我比较熟悉的一款仿真软件,固然选它作为设计功能的验证.为了将vivado和mod ...

  6. 团队小组开发nabc分析

    我们团队开发的项目为:牛逼的手电筒 NABC模型: 1.N:现在每个人几乎走哪,干什么都会拿着手机,而现在年轻人晚上在外面的也不少,所以手机里安装一个手电筒的APP还是很有必要的. 2.A:这学期正在 ...

  7. background-origin

    background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...

  8. 【长期兼职】每天3小时写作=每月4000元外快(IT兼职写手)

    只要你有经验,每周平均有20来个小时的兼职时间. 只要你愿意静静地写一些心得总结. 那么就可以联系我QQ164349714,敲门:写作. 地址不限.特长不限.学历不限.年龄不限. 主要写作方向:1.投 ...

  9. ptype_base和ptype_all学习笔记

    "linux-2.6.32/include/linux/netdevice.h" struct packet_type { __be16 type; /* This is real ...

  10. 【POJ】【3680】Intervals

    网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...