传送门

线段树常规操作了解一下。

单点修改维护区间最大连续和。

对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和。

代码如下:

#include<bits/stdc++.h>
#define N 500005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
struct Node{int l,r,ls,rs,ms,sum;}T[N<<2];
int n,m,a[N];
inline int max(int a,int b){return a>b?a:b;}
inline void pushup(int p){
    T[p].sum=T[lc].sum+T[rc].sum;
    T[p].ls=max(T[lc].ls,T[lc].sum+T[rc].ls);
    T[p].rs=max(T[rc].rs,T[rc].sum+T[lc].rs);
    T[p].ms=max(max(T[lc].ms,T[rc].ms),T[lc].rs+T[rc].ls);
}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r;
    if(l==r){T[p].ls=T[p].rs=T[p].ms=T[p].sum=a[l];return;}
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(p);
}
inline void update(int p,int k,int v){
    if(T[p].l==T[p].r){
        T[p].ls=T[p].rs=T[p].ms=T[p].sum=v;
        return;
    }
    if(k<=mid)update(lc,k,v);
    else update(rc,k,v);
    pushup(p);
}
inline Node query(int p,int ql,int qr){
    if(ql<=T[p].l&&T[p].r<=qr)return T[p];
    if(qr<=mid)return query(lc,ql,qr);
    if(ql>mid)return query(rc,ql,qr);
    Node ans1=query(lc,ql,mid),ans2=query(rc,mid+1,qr),ans;
    ans.l=ans1.l,ans.r=ans2.r;
    ans.ls=max(ans1.ls,ans1.sum+ans2.ls);
    ans.rs=max(ans2.rs,ans2.sum+ans1.rs);
    ans.ms=max(max(ans1.ms,ans2.ms),ans1.rs+ans2.ls);
    ans.sum=ans1.sum+ans2.sum;
    return ans;
}
inline int read(){
    int ans=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans*w;
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;++i)a[i]=read();
    build(1,1,n);
    while(m--){
        int op=read(),a=read(),b=read();
        switch(op){
            case 1:{if(a>b)a^=b,b^=a,a^=b;printf("%d\n",query(1,a,b).ms);break;}
            default:{update(1,a,b);break;}
        }
    }
    return 0;
}

2018.07.23 洛谷P4513 小白逛公园(线段树)的更多相关文章

  1. 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)

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

  2. 洛谷P4513 小白逛公园 (线段树)

    这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用dp,充分利用线段树递归的优势来处理.个人理解:线段树相当于把求整个区间的最大子段和的问题不断划分为很多个小问题,容易解决小问题,然后递 ...

  3. 洛谷P4513 小白逛公园

    区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...

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

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

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

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

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

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

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

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

  8. 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

    传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...

  9. [日常摸鱼]Vijos1083小白逛公园-线段树

    题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...

随机推荐

  1. delegate() 事件绑定 事件委托

    定义和用法 delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数. 使用 delegate() 方法的事件处理程序适用于当前或未来 ...

  2. centor os 安装nginx

    安装nginx和health check wget http://nginx.org/download/nginx-1.4.5.tar.gz git clone https://github.com/ ...

  3. 正则表达式(Java,C#,C++)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  4. 原生nodejs 学习笔记2

    本章节学习流, 流的一个好处在于减少各种异步IO的回调地狱.IO操作遍及我们各种操作,比如数据库读写,文件读写, 文件转换压缩--别的不说,比如第一节,我们要将一个HTML文件返回浏览器,就涉及IO操 ...

  5. 基元线程同步构造之信号量(Semaphore)

    信号量(semaphore)不过是由内核维护的 int32变量而已,(说通俗点就是好比一个线程容器里面允许执行的线程数,0计数就是允许执行的0个线程数,1就是允许执行的1个线程数,2就是允许执行的2个 ...

  6. eclipse zg项目学习

    一.基本知识 1.新增测试系统: xx/jsp:用于摆放jsp xx/src:放置java source 2.在项目上,右键,New-Folder,新建xx文件夹. 同样的方法,在xx文件夹上,右键N ...

  7. jQuery源码解读三选择器

    直接上jQuery源码截取代码 // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ i ...

  8. Java连接MySQL数据库及操作

    Java操作MySQL数据库,需要驱动mysql-connector-java 来进行操作,去下载对应的jar包   一.导入需要的jar包 我用的是maven对包进行管理,在maven中添加如下内容 ...

  9. Redis事务的简单理解

    Redis事务的命令如下所示: 先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令 示例如下: //开始一个事务 > MU ...

  10. Android笔记:RelativeLayout

    RelativeLayout 又称作相对布局,也是一种非常常用的布局.和 LinearLayout 的排列规则不同,RelativeLayout 显得更加随意一些,它可以通过相对定位的方式让控件出现在 ...