[日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$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小白逛公园-线段树的更多相关文章
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- Vijos 1083 小白逛公园(线段树)
线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...
- [vijos]1083小白逛公园<线段树>
描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公 ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 【线段树】bzoj1756 Vijos1083 小白逛公园
我们知道,求一段序列的最大子段和是O(n)的,但是这样是显然会超时的. 我们需要一个数据结构来支持修改和计算的操作,对于这种修改一个而查询区间的问题,考虑使用线段树. 在线段树中,除了左端点,右端点, ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- bzoj1756 Vijos1083 小白逛公园
Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. ...
随机推荐
- MathType单边大括号的编辑技巧你知道吗?
大家都知道,一般情况下,数学里面的括号都是成对出现的,但是也有些情况下可以只用到单边的括号,就比如分段函数,在编写的时候只需用到左半边的括号.MathType作为专业的公式编辑器,用它来编写公式再方便 ...
- H5系列之drag拖放
H5中, 有个属性,draggable="true", 这个属性呢(默认false),需要加在标签上,加上去该标签就可以拖动了, 看下gif图吧 默认的标签,是不能拖动的,但是有两 ...
- css万能清除原理
如果现在能有清理浮动的办法,但不至于在文档中多一个没有用的空标记,这时的效果是最好的!引入:after伪元素选择器,可以在指定的元素的内容添加最后一个子元素 .container:after{ } 如 ...
- mycat分片及主从(二)
一.mycat分片规则 经过上一篇幅讲解,应该很清楚分片规则配置文件rule.xml位于$MYCAT_HOME/conf目录,它定义了所有拆分表的规则.在使用过程中可以灵活使用不同的分片算法,或者对同 ...
- 蓝桥杯——复数幂 (2018JavaAB组第3题)
18年Java蓝桥杯A组第3题和B组是一样的. 第三题往往比较难. 复数幂 (18JavaAB3) (A.B两卷第三题一样) 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. ...
- 【mq读书笔记】如何保证三个消息文件的最终一致性。
考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致. commitlog,consumeQueue遍历每一条消息 ...
- TkMybatis 是什么?
一.TkMybatis Tkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率. 二.怎么用? ...
- 初探Lerna
1.简介 首先是关于Monorepo(一篇不错的介绍Monorepo的文章),它是管理项目代码的一种方式,主要手段是通过在一个项目仓库中管理多个模块/仓库包.而Multirepo是传统的仓库管理方法, ...
- Mac下打开DDMS(AndroidDeviceMonitor)白屏
mac打开AndroidStudio下的ddms(也就是AndroidDeviceMontor)白屏,是由于jdk版本号较高不兼容导致的,因此需要将jdk降为jdk1.8.0_144就可以来了,但是要 ...
- websocket简单实现五子棋即时对战功能
几年前做的一个小demo,代码比较老,先上下html显示效果图 因为代码中注释比较详细,所以就直接上代码了 html代码,也就是上图展示的效果页面 <!DOCTYPE html> < ...