线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当前区间已经更新了。其主要使用了Lazy思想。

Lazy思想:lazy-tag思想,记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。
在此通俗的解释Lazy(t偷懒)的意思,比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,它的节点标记为rt,这时tree[rt].l == a && tree[rt].r == b 这时我们可以一步更新此时rt节点的sum[rt]的值,sum[rt] += c * (tree[rt].r - tree[rt].l + 1),注意关键的时刻来了,如果此时按照常规的线段树的update操作,这时候还应该更新rt子节点的sum[]值,而Lazy思想恰恰是暂时不更新rt子节点的sum[]值,到此就return,直到下次需要用到rt子节点的值的时候才去更新,这样避免许多可能无用的操作,从而节省时间 。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
const int MAXN = +;
typedef long long LL;
using namespace std;
struct Tnode{
int b, e;
LL sum; //当前区间和
LL mark; //延迟标记
};
Tnode tree[*MAXN];
int n;
void Build(int v, int b, int e){
tree[v].b = b, tree[v].e = e;
tree[v].sum=tree[v].mark = ;
if (b < e){
int mid = (b + e) >> ;
Build( * v + , b, mid);
Build( * v + , mid + , e);
}
}
void update(int v, int l, int r, LL value){
if (l == tree[v].b&&r == tree[v].e){
tree[v].mark += value; //该区间每个数都要增加value,它的子区间可以先不更新(Lazy)
return; //直接返回了
}
tree[v].sum += value*(r - l + ); //将增加的值更新进去
int mid = (tree[v].b + tree[v].e) >> ;
if (r <= mid)
update( * v + , l, r, value);
else if (l > mid)
update( * v + , l, r, value);
else{
update( * v + , l, mid, value);
update( * v + , mid + , r, value);
}
}
LL Qurrey(int v, int l, int r){
if (tree[v].b==l&&tree[v].e==r)
return tree[v].sum+(r-l+)*tree[v].mark;
if (tree[v].mark != ){ //之前欠的债现在要还了
//如果当前区间mark不为0,则将它传递给子区间
tree[ * v + ].mark += tree[v].mark;
tree[ * v + ].mark += tree[v].mark;
tree[v].sum += tree[v].mark*(tree[v].e-tree[v].b+);
tree[v].mark = ;
}
int mid = (tree[v].b + tree[v].e) >> ;
if (r <= mid)
return Qurrey( * v + , l, r);
else if (l > mid)
return Qurrey( * v + , l, r);
else
return Qurrey( * v + , l, mid) + Qurrey( * v + , mid + , r); }
int main(){
long long x;
int a, b,i,q;
char ch;
scanf("%d%d", &n, &q);
Build(, , n);
for (i = ; i <= n; i++){
scanf("%lld", &x);
update(, i, i, x);
}
while (q--){
cin >> ch;
scanf("%d%d", &a, &b);
if (ch == 'Q')
printf("%lld\n", Qurrey(, a, b));
else{
scanf("%lld", &x);
update(, a, b, x);
}
}
return ;
}

poj 3648 线段树成段更新的更多相关文章

  1. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  2. poj 3669 线段树成段更新+区间合并

    添加 lsum[ ] , rsum[ ] , msum[ ] 来记录从左到右的区间,从右到左的区间和最大的区间: #include<stdio.h> #define lson l,m,rt ...

  3. poj 3468 线段树成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 54012   ...

  4. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  5. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  6. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  7. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  8. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  9. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

随机推荐

  1. git+jenkins持续集成二-jenkins定时构建语法:定时构建语法

    构建位置:选择或创建工程_设置_构建触发器 1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月 ...

  2. Python-伪私有属性

    原文:http://blog.itpub.net/26250550/viewspace-1411768/ 通常在 Python 中,我们都被告知可以使用双下划线开头的方法名定义方法来达到私有函数的目标 ...

  3. ValueStack、ActionContext

    笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 1. ValueStac ...

  4. 软工实践 - 第九次作业 Alpha 冲刺 (1 / 10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/9949350.html 作业博客:(班级博客本次作业的链接) 组员情况 组员1(队长):白晨曦 ...

  5. 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...

  6. P1463 [HAOI2007]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  7. wooyun

    转自:http://zone.wooyun.org/content/19128 tencent.com baidu.com sina.com.cn sohu.com discuz.net rising ...

  8. npm使用问题总结

    1.报错npm run dev error [npm ERR! code ELIFECYCLE] 解决方法 rm -rf node_modules rm package-lock.json npm c ...

  9. jquery 实践操作:div 动态嵌套(追加) div

    此片记录在指定 div 中动态添加 div html(): append(): 在被选元素的结尾(但仍在元素内部)插入指定的内容. 语法: $(selector).append(content); / ...

  10. Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

    参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...