题目链接: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. Swift Explore - 关于 Swift 中的 isEqual 的一点探索

    在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...

  2. MySQL命令输入错误 取消命令

    mysql命令行输入错误字符需要取消执行时,可在分号“:”出现前输入“\c”来取消该条命令,注意c前边的“\”.   1 2 3 4 mysql> select -> user() -&g ...

  3. 【分享】生成带数据的Insert语句工具(源码)

    这个工具用于导出带数据的Insert语句,方便在不同版本的数据库上导出数据.有人说sql server 2008自带导出带数据的Insert语句(连接)但是我的数据库版本没有这个选项,无奈之下自己简单 ...

  4. Linux C 文件与目录2 文件的打开与关闭

    文件的打开与关闭 open和close 文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号.打开的文件处于可读.可写状态.文件的关闭指的是释放打开的文件,是文件处于不可读写的状态. ...

  5. 新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法

    本文部分内容转载自: http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html http://www.aichengxu.com/v ...

  6. Android -- Webview自适应屏幕

    第一种                                                                                          WebSett ...

  7. iOS多线程自定义operation加载图片 不重复下载图片

    摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用:   2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验   2:自定义operati ...

  8. Mac下安装Tomcat及配置

    今天介绍Mac下Tomcat的安装及配置: 1.在搜索引擎(如:必应或百度)中搜索“Tomcat”,第一条搜索结果就是Tomcat官方地址: 2.在左侧选择“Tomcat8”或“Tomcat9”,我这 ...

  9. Why Every Professional Should Consider Blogging

    转自http://www.pixelstech.net/article/1327829407-Why-Every-Professional-Should-Consider-Blogging ften ...

  10. OS X 使用技巧——访问所有的键盘功能

    苹果笔记本电脑和苹果的无线键盘只有一个Delete键,可以删除光标前面的字. 按住Fn键再按Delete键就能删除光标后面的字符. 按住Fn键会把上下方向键的效果变成Page Up / Page Do ...