题目链接: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. ASP.NET2.0中对TextBox的Enable和ReadOnly属性的限制

    在以前的ASP.NET 1.x版本中,设置为ReadOnly的TextBox控件在客户端更改了值后,在服务器端仍然可以得到修改后的值,但在ASP.NET 2.0中,这种做法已经限制.这是为了提高应用程 ...

  2. 条款20:以const-reference传递替换by-value传递

    缺省情况下,C++中函数参数的传递方式为by-value.即函数都是以实际参数的副本进行传递,而函数返回的也是一个副本.考虑如下实例程序: #include <iostream> clas ...

  3. R 语言中文乱码问题

    R 语言似乎在WINDOWS平台上对中文的支持不是特别好,似乎是3.1.2的一个BUG. 目前我研究出了一个临时解决方案,你可以将代码编写成一个函数,从而在调用的过程中不必如下繁琐: 1. 先将本地语 ...

  4. 【转载】set_input_delay和set_output_delay的选项-max和-min的讨论

    转自:http://www.cnblogs.com/freshair_cnblog/archive/2012/09/12/2681060.html 一.存在背景分析 文档的说法是,set_input_ ...

  5. UIToolbar swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  6. P2763: [JLOI2011]飞行路线

    然而WA了呀,这道分层图,也是不明白为什么WA了=-= ; maxn=; points=; type node=record f,t,l:longint; end; var n,m,k,i,j,u,v ...

  7. c++中头文件include规则浅析[译]

    英文原文地址 在开发大型的软件项目时,头文件需要得到恰当的管理,甚至在c中也会面临这种问题,当我们用c++开发时,头文件的管理会变得更复杂,更加耗费我们的时间去管理,下面我将讲一些包含规则来简化这个苦 ...

  8. web 性能忧化(IIS篇)

    1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS Manager > ApplicationPools > Advanced Settings 2.   ...

  9. AutoMap1.0发布

    去年就已经透漏了AutoMap的雏形,后面一段时间一直没有充裕的时间来完成,只能零星的进行完善.现在产品还有很多不足,基本架构已经完成,就先释放一个1.0版,希望大家多多支持. 一.服务端 服务端在I ...

  10. Retry Pattern

    Retry Pattern https://msdn.microsoft.com/en-us/library/dn589788.aspx https://msdn.microsoft.com/en-u ...