【成端更新线段树模板】POJ3468-A Simple Problem with Integers
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的更多相关文章
- 线段树专题 POJ3468 A Simple Problem with Integers
题意:n个点.m个操作.两种操作类型.C X Y K 表示区间[x,y]上每一个点值加k.Q X Y 求区间[x,y]的和 分析:线段树区间求和,裸模板 注意:结果会超int,要用long long ...
- (线段树模板)A Simple Problem with Integers --POJ--3468
链接: http://poj.org/problem?id=3468 代码: #include<stdio.h> #include<algorithm> #include< ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
- 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和
poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...
- POJ3468 A Simple Problem with Integers 【段树】+【成段更新】
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 57666 ...
- poj3468 A Simple Problem with Integers (线段树区间最大值)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92127 ...
- poj3468 A Simple Problem with Integers(zkw区间修改模板)
此题是一道线段树的裸题,这里只是为了保存我的zkw线段树模板 #include <cstdio> #include <cstring> #include <iostrea ...
- poj3468 A Simple Problem with Integers (树状数组做法)
题目传送门 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 1 ...
- poj------(3468)A Simple Problem with Integers(区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 60745 ...
随机推荐
- 设计模式之Factory
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Factory Pattern有3种当然是全部是creational pattern. 1.S ...
- linux 服务简介
Linux服务(Linux services)对于每个应用Linux的用户来说都很重要.关闭不需要的服务,可以让Linux运行的更高效,但并不是所有的Linux服务都可以关闭.今天安装了一次CentO ...
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- Caffe学习笔记2
Caffe学习笔记2-用一个预训练模型提取特征 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hi ...
- Vue组件-组件的属性
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 比如,子组件需 ...
- pycaffe做识别时通道转换问题
转自--------------------- 作者:Peanut_范 来源:CSDN 原文:https://blog.csdn.net/u013841196/article/details/7 ...
- Leetcode 之Wildcard Matching(32)
跟上题类似,主要考虑‘*’的匹配问题.如果遇到‘*’,则跳过继续匹配,如果不匹配,则s++,重新扫描. bool isMatch2(const char *s, const char *p) { if ...
- python 作业
Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...
- hadoop 分布式环境安装
centos 多台机器免密登录 hadoop学习笔记(五)--全分布模式下SSH免密码登陆的实现 参考安装教程 Hadoop-2.7.4 集群快速搭建 启动hadoop cd /opt/soft/ha ...
- 使用Guava retryer优雅的实现接口重调机制
API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒.guava-retry可以灵活的实现这一功能.Guava r ...