题意:单点修改,询问区间最大子段和,$n\leq 5e5$


考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案,要么是左边的最大后缀和加上右边的最大前缀和。而一个区间的最大前缀和又会等于它左区间的最大前缀和或者是左区间的和加上右区间最大前缀和。

基于这种思想我们就有了一种动态求最大字段和的算法了,区间和,前缀后缀和,都可以直接用线段树维护,用这些信息就能求出最大子段和了。

注意询问的时候应该把整个结点的信息储存下来,因为我们要查询的是一个区间而不是一整段,如果直接返回结点的答案话可能会把询问区间外面的信息也算进来。

#include<cstdio>
typedef long long lint;
const int N=500005;
inline lint read()
{
lint s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
}
struct node
{
lint ls,rs,key,s;
node(lint a=0,lint b=0,lint c=0,lint d=0):ls(a),rs(b),key(c),s(d){}
};
int n,m;
lint ls[N<<2],rs[N<<2],key[N<<2],s[N<<2],v[N]; inline void swap(int &a,int &b){int t=a;a=b;b=t;}
inline lint max(lint a,lint b){return a>b?a:b;}
#define lson (o<<1)
#define rson (o<<1|1)
inline void push_up(int o)
{
ls[o]=max(ls[lson],s[lson]+ls[rson]);
rs[o]=max(rs[rson],s[rson]+rs[lson]);
s[o]=s[lson]+s[rson];
key[o]=max(max(key[lson],key[rson]),rs[lson]+ls[rson]);
}
inline void build(int o,int l,int r)
{
if(l==r)
{
ls[o]=rs[o]=key[o]=s[o]=v[l];
return;
}int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
push_up(o);
}
inline void modify(int o,int l,int r,int q,lint val)
{
if(l==r)
{
ls[o]=rs[o]=key[o]=s[o]=val;
return;
}
int mid=(l+r)>>1;
if(mid>=q)modify(lson,l,mid,q,val);
else modify(rson,mid+1,r,q,val);
push_up(o);
}
inline node query(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return node(ls[o],rs[o],key[o],s[o]);
int mid=(l+r)>>1,op=0;node L,R,ans;
if(mid>=ql)L=query(lson,l,mid,ql,qr),op++;
if(mid+1<=qr)R=query(rson,mid+1,r,ql,qr),op+=2;
if(op==1)return L;if(op==2)return R;
ans.ls=max(L.ls,L.s+R.ls);ans.rs=max(R.rs,R.s+L.rs);
ans.s=L.s+R.s;ans.key=max(max(L.key,R.key),L.rs+R.ls);
return ans;
} #undef lson
#undef rson int main()
{
n=read();m=read();
for(register int i=1;i<=n;i++)v[i]=read();
build(1,1,n);
while(m--)
{
int op,a,b;op=read();
if(op==1)
{
a=read();b=read();if(a>b)swap(a,b);
printf("%lld\n",query(1,1,n,a,b).key);
}else
{
a=read();b=read();
modify(1,1,n,a,b);
}
}
}

[日常摸鱼]Vijos1083小白逛公园-线段树的更多相关文章

  1. Bzoj 1756: Vijos1083 小白逛公园 线段树

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1021  Solved: 326[Submit][Statu ...

  2. Vijos 1083 小白逛公园(线段树)

    线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...

  3. [vijos]1083小白逛公园<线段树>

    描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公 ...

  4. P4513 小白逛公园 (线段树)

    题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...

  5. BZOJ 1756: Vijos1083 小白逛公园

    题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 856  Solved: 264[Submit][Sta ...

  6. 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园

    题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...

  7. 【线段树】bzoj1756 Vijos1083 小白逛公园

    我们知道,求一段序列的最大子段和是O(n)的,但是这样是显然会超时的. 我们需要一个数据结构来支持修改和计算的操作,对于这种修改一个而查询区间的问题,考虑使用线段树. 在线段树中,除了左端点,右端点, ...

  8. 【BZOJ】1756: Vijos1083 小白逛公园(线段树)

    题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀  区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...

  9. bzoj1756 Vijos1083 小白逛公园

    Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. ...

随机推荐

  1. The Life out of coding_Employment_01

    1.工作与个人价值 软技能读书笔记第一篇:--From 安晓辉 内生涯与外生涯 内生涯包括知识.技能.工作经验.心理素质.内心情感.行为习惯.视野.观念.职业心态.职业成熟度.心灵成长. 外生涯包括职 ...

  2. Boom 3D带你聆听《我们的乐队》音乐盛宴

    说到前段时间大热的音乐类综艺节目,<我们的乐队>肯定值得一提.<我们的乐队>是由谢霆锋.萧敬腾.王俊凯担任导师,以团队的形式组成各种风格的乐队,并通过同场比拼,最终选出获胜的乐 ...

  3. Python变量引用

    >>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...

  4. Tarjan 算法总结

    一些概念 连通:无向图中的任意两点都可以互相到达. 强连通:有向图中的任意两点都可以互相到达. 连通分量:无向图的极大连通子图. 强连通分量:有向图的极大强连通子图. DFS 生成树:对一张图(有向无 ...

  5. The First Assignment

    我的第一条随笔 ========== 这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-2 这个作业要求在哪里 https://edu.cn ...

  6. Qt实现客户端与服务器消息发送与文件传输

    Qt实现客户端与服务器消息发送与文件传输需要使用到 QTcpSocket:提供套接字QTcpServer:提供基于TCP的服务端,官方文档的解释如下: This class makes it poss ...

  7. GitHub上最火的、最值得前端学习的几个数据结构与算法项目!没有之一!

    Hello,大家好,我是你们的 前端章鱼猫. 简介 前端章鱼猫从 2016 年加入 GitHub,到现在的 2020 年,快整整 5 个年头了. 相信很多人都没有逛 GitHub 的习惯,因此总会有开 ...

  8. AndroidStudio新导入项目,无法编译,rebuild、clean都无效

    此按钮,可以用gradle重新编译

  9. 安装IAR编译器详解

    1.首先下载好安装包和破解包 我安装使用的版本:IAR for 8051 v9.10 链接: https://pan.baidu.com/s/13x36j5qL90YokrAlyChQhw 提取码: ...

  10. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...