线段树: CDOJ1598-加帕里公园的friends(区间合并,单点更新)
加帕里公园的friends
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 131072/131072KB (Java/Others)
我还有很多话想和她说,还有很多地方想和她去,把Kaban酱还给我!——Sabaru
薮猫酱为了从天蓝怪手里拯救小包,必须发现天蓝怪们的弱点所在。具体来说,n只天蓝怪组成了一个序列A,每一只有一个战斗力数值Ai,
之后会发生m个事件,事件共有两种类型,有可能是1、薮猫酱给你一个区间[a,b],要你输出max{Ap+Ap+1+…+Aq}(a≤p≤q≤b)max{Ap+Ap+1+…+Aq}(a≤p≤q≤b)2、第pos只天蓝怪的战斗力变成了X。
Input
第一行是两个整数n、m,第二行包含n个整数A1,A2,…,An,接下来m行,每行三个整数,可能是1 a b,代表薮猫酱的一次询问;2 pos X,代表某只天蓝怪战斗力的变化。
Output
对于每次询问,单独输出一行,代表答案。
Sample Input
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
Sample Output
2
-1
Hint
1≤n≤500000
1≤m≤100000
−1000≤Ai≤1000
1≤a≤b≤n
1≤pos≤n
−1000≤X≤10000
解题心得:
- 这个题就是一个线段树区间合并问题,询问的是一个区间内的最大值并且,多次询问,还要改变某一个点的值,因为是单点,所以可以直接该,不用lazy标记。
- 关于线段树的区间合并问题可以看看线段树的区间合并相关问题。这个还更简单。只需要每次维护一个节点左方的最大值,右方的最大值还有整个最大值以及整个区间的和(整个区间的和在合并的时候用来判断一边的最大值是否超过了其中一个子节点)。
- 在写这个题的时候写了要给bug,就是在想上更新的时候父节点的一切信息都是又子节点维护而来的,所以父节点的最大值不是从本身的左方的最大值和自身右方的最大值而来,是从子节点的各处维护而来。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+100;
int n,m;
struct node
{
int l,r,Max,lMax,rMax,sum;
}tree[maxn<<2];
void pushup(int root)
{
tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
tree[root].lMax = max(tree[root<<1].lMax,tree[root<<1].sum + tree[root<<1|1].lMax);
tree[root].rMax = max(tree[root<<1|1].rMax,tree[root<<1|1].sum + tree[root<<1].rMax);
//这里要注意父节点的一切信息都是从子节点维护而来的
tree[root].Max = max(tree[root<<1].Max,max(tree[root<<1|1].Max,tree[root<<1].rMax+tree[root<<1|1].lMax));
}
void build_tree(int l,int r,int root)
{
tree[root].l = l;
tree[root].r = r;
if(l == r)
{
scanf("%d",&tree[root].Max);
tree[root].lMax = tree[root].rMax = tree[root].Max;
tree[root].sum = tree[root].Max;
return ;
}
int mid = (l + r) >> 1;
build_tree(l,mid,root<<1);
build_tree(mid+1,r,root<<1|1);
pushup(root);
}
node query(int L,int R,int l,int r,int root)
{
if(L <= l && R >= r)
{
return tree[root];
}
int mid = (l + r) >> 1;
if(R <= mid)
return query(L,R,l,mid,root<<1);
else if(L > mid)
return query(L,R,mid+1,r,root<<1|1);
else
{
node m1 = query(L,mid,l,mid,root<<1);
node m2 = query(mid+1,R,mid+1,r,root<<1|1);
node m3;
//这里需要将两个树结合起来相比较,所以需要返回一个node
m3.Max = max(m1.Max,max(m2.Max,m1.rMax+m2.lMax));
m3.lMax = max(m1.lMax,m1.sum+m2.lMax);
m3.rMax = max(m2.rMax,m2.sum + m1.rMax);
m3.sum = m2.sum + m1.sum;
return m3;
}
}
//单点更新
void change(int pos,int num,int l,int r,int root)
{
if(l == r)
{
tree[root].Max = tree[root].lMax = tree[root].rMax = tree[root].sum = num;
return ;
}
int mid = (l + r) >> 1;
if(pos <= mid)
change(pos,num,l,mid,root<<1);
else if(pos > mid)
change(pos,num,mid+1,r,root<<1|1);
pushup(root);
}
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
build_tree(1,n,1);
while(m--)
{
int k,a,b;
scanf("%d%d%d",&k,&a,&b);
if(k == 1)
{
node ans = query(a,b,1,n,1);
printf("%d\n",ans.Max);
}
else
{
change(a,b,1,n,1);
}
}
}
}
线段树: CDOJ1598-加帕里公园的friends(区间合并,单点更新)的更多相关文章
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- hdu 3308 线段树 区间合并+单点更新+区间查询
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 线段树模板加模板题POJ3468
POJ - 3468 整理了个新的线段树的模板,暑期集训的时候学长给的模板,每个节点单单存了自己所要维护的内容,还是少了点.导致在写pushdown的时候,len我会有点难写.所以就整理个新的模板. ...
- hdu4973 线段树(题目不错,用了点,段,更新查找还有DFS)
题意: 给你一个初始序列,初始序列长度n,分别为1 2 3 4 5 ....n,有两种操作 (1)D l r 把l_r之间的数据都复制一遍 1 2 3 4 5 6 D 2 4 = 1 2 ...
- HDU 2795 线段树区间最大值,单点更新+二分
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 1116 敌兵布阵 线段树 区间求和 单点更新
线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson ...
- Luogu 3373 - 【模板】线段树 2 - [加乘线段树]
题目链接:https://www.luogu.org/problemnew/show/P3373 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个 ...
- hdoj 1166 敌兵布阵【线段树求区间最大值+单点更新】
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- ListView的圆角的简单实现
今天在用ListView控件的时候,发现自带的不美观,就是找找相关的美化教程,发现都挺麻烦的,无意中发现一个开源项目,地址:点击打开链接,使用起来很简单,官方网站说的也很简单,就是导入库,然后像其他控 ...
- Java虚拟机内存分配与回收策略
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...
- 深入JVM内核---原理,诊断与优化
JVM的概念 JAM是Java Virtual Machine的简称.意为Java虚拟机 虚拟机 指通过软件模拟的具有完整硬件系统功能的,运行在一种完整隔离环境中的完整计算机系统 有哪些虚拟机 - V ...
- spring boot + spring data jpa
Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...
- MySQL获取某个时间范围内的数据 TO_DAYS(date)函数
1.利用to_days函数查询今天的数据: select * from 表名 where to_days(时间字段名) = to_days(now()); to_days函数:返回从0000年(公元1 ...
- 移动端的300ms延迟和点击穿透
移动端300ms延迟:假定这么一个场景.用户在 浏览器里边点击了一个链接.由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行 ...
- Ubuntu 12.04源
deb http://ubuntu.uestc.edu.cn/ubuntu/ precise main restricted universe multiverse deb http://ubuntu ...
- android 代码将数据库文件导出到sd卡
public static void save() { String dbpath = "/data/data/tl.cac.view/databases/" +"afi ...
- Hadoop 2.7.0模拟分布式实验环境搭建[亲测]
实验目的: 本实验通过在PC电脑上同时运行3个虚拟机,一个为master节点,两个slave节点. 搭建环境: 主机:mac os 10.10 OS:CenOS 6.5 虚拟机:VMware ...
- db2新添用户
--1.新添用户 -目录 /XX/XX -组 XX 用户名useradd -d /home/xx -g users xx--2.修改密码passwd xx--3.在QC中grant权限.新添表空 ...