http://poj.org/problem?id=3468

_(:зゝ∠)_我又活着回来啦,前段时间太忙了写的题没时间扔上来,以后再说。

【问题描述】

成段加某一个值,然后询问区间和。

【思路】

讲一下pushdown和pushup出现的几个位置。

pushup:

(1)build的结尾,当叶子节点分别有对应的值后,它的父亲们就等于它们求和。

(2)update的结尾,因为此时当前根的左右孩子已经更新了,故它也需要更新。

pushdown(延迟标记):

*pushdown会出现在一切要从当前结点往下的位置

query和update中,要先把add的值传给两个儿子。

接下来整理一下思路,每一个子过程分别需要如何操作:

build(建立线段树)

(1)将add清零

(2)如果左子树等于右子树,则说明已经到达叶子节点,读入sum的值,返回

(3)向左右子树递归

(4)pushup更新当前根

update(修改)

(1)如果当前的L和R包含在l和r中,则让add+δ,让sum+δ*当前区间的长度,返回

(2)pushdown向下延迟标记

(3)向左右子树递归

(4)pushup更新当前根

query(查询)

(1)如果当前的L和R包含在l和r中,则直接返回sum[rt]

(2)pushdown向下延迟标记

(3)向左右子树递归,将得到的返回值加到result总

(4)返回result

一般的线段树就是这样操作的,其实还挺简单(。・∀・)ノ゙最近学业有点忙好久没写程序了,整理一个当作恢复一下手速。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
const int MAXN=+;
int n,q;
LL add[MAXN];
LL sum[MAXN]; void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
} void build(int l,int r,int rt)
{
add[rt]=;
if (l==r)
{
scanf("%lld",&sum[rt]);
return;
}
int m=(l+r)/;
build(lson);
build(rson);
pushup(rt);
} void pushdown(int rt,int m)
{
if (add[rt])
{
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
sum[rt<<]+=add[rt]*(m-(m>>));
sum[rt<<|]+=add[rt]*(m>>);
add[rt]=;
}
} LL query(int L,int R,int l,int r,int rt)
{
if (L<=l && R>=r)
{
return sum[rt];
}
pushdown(rt,r-l+);
int m=(l+r)/;
LL rs=;
if (m>=L) rs+=query(L,R,lson);
if (m<R) rs+=query(L,R,rson);
return rs;
} void update(int L,int R,int delta,int l,int r,int rt)
{
if (L<=l && R>=r)
{
add[rt]+=delta;
sum[rt]+=(LL)delta*(r-l+);
return;
}
pushdown(rt,r-l+);
int m=(l+r)/;
if (m>=L) update(L,R,delta,lson);
if (m<R) update(L,R,delta,rson);
pushup(rt);
} int main()
{
scanf("%d%d",&n,&q);
build(,n,);
for (int i=;i<q;i++)
{
char c[];
scanf("%s",c);
if (c[]=='C')
{
int fr,ed,ad;
scanf("%d%d%d",&fr,&ed,&ad);
update(fr,ed,ad,,n,);
}
else
{
int a,b;
scanf("%d%d",&a,&b);
cout<<query(a,b,,n,)<<endl;
}
}
return ;
}

【成端更新线段树模板】POJ3468-A Simple Problem with Integers的更多相关文章

  1. 线段树专题 POJ3468 A Simple Problem with Integers

    题意:n个点.m个操作.两种操作类型.C X Y K 表示区间[x,y]上每一个点值加k.Q X Y 求区间[x,y]的和 分析:线段树区间求和,裸模板 注意:结果会超int,要用long long ...

  2. (线段树模板)A Simple Problem with Integers --POJ--3468

    链接: http://poj.org/problem?id=3468 代码: #include<stdio.h> #include<algorithm> #include< ...

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

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

  4. 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和

    poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...

  5. POJ3468 A Simple Problem with Integers 【段树】+【成段更新】

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

  6. poj3468 A Simple Problem with Integers (线段树区间最大值)

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

  7. poj3468 A Simple Problem with Integers(zkw区间修改模板)

    此题是一道线段树的裸题,这里只是为了保存我的zkw线段树模板 #include <cstdio> #include <cstring> #include <iostrea ...

  8. poj3468 A Simple Problem with Integers (树状数组做法)

    题目传送门 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 1 ...

  9. poj------(3468)A Simple Problem with Integers(区间更新)

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

随机推荐

  1. margin 居中

    左右auto加个宽度.margin-left: auto; margin-right: auto; width:640px;

  2. bzoj 2121 DP

    首先如果我们能处理出来i,j段能不能消掉,这样就可以直接dp转移了,设w[i]为前i为最少剩下多少,那么w[i]=w[j-1] (flag[j][i]). 现在我们来求flag[i][j],首先我们可 ...

  3. mysql之基本数据库操作(二)

    环境信息 数据库:mysql-5.7.20 操作系统:Ubuntu-16.04.3 mysql的启动.退出.重启 # 启动 $ sudo service mysqld start # 停止 $ sud ...

  4. 【转】C++多继承的细节

    这几天写的程序应用到多继承. 以前对多继承的概念非常清晰,可是很久没用就有点模糊了.重新研究一下,“刷新”下记忆. 假设我们有下面的代码: #include <stdio.h> class ...

  5. Linux-进程间通信(三): 共享内存

    1. 共享内存: 共享内存方式可以在多个进程直接共享数据,因为其直接使用内存,不要多余的拷贝,是速度最快的IPC方式: 共享内存有两种实现方式,使用mmap和shm方式,如下图: (1) mmap方式 ...

  6. 不要用Serverzoo 提供的CloudLinux 的五大原因 Linode 強大VPS 資源為你解密

    不要用Serverzoo 提供的CloudLinux 的五大原因 Linode 強大VPS 資源為你解密 https://www.williamformosa.com/cloud-linux/

  7. python的时间和日期--time、datetime应用

    time >>> import time >>> time.localtime() #以time.struct_time类型,打印本地时间 time.struct_ ...

  8. codevs 3287 货车运输 NOIP2013提高组

    题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 #include< ...

  9. VPS性能综合测试(6):UnixBench跑分工具测试

    测试时间可能会比较长,请耐心等待.最后UnixBench会详细列出各个测试项目的得分情况,以及VPS性能的综合跑分结果 UinxBench 的使用 使用方法如下: Run [ -q | -v ] [- ...

  10. 如何用jQuery获得radio的值

    如何获得radio的值,在网上查了一下,下面总结几种解决方法,. 1.获取选中值: $('input:radio:checked').val(): $("input[type='radio' ...