链接:https://www.luogu.org/problemnew/show/P4513

思路: 很基础的区间合并,开四个数组:

num: 区间数字的和

lsum:从左端点起最大连续字段和

rsum:从右端点起最大连续字段和

sum:区间最大连续字段和

然后按照以前合并的思路合并下就完事了。

好久没写区间合并的题。。还被卡了一阵子,属实弟弟

实现代码;

#include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
const int M = 1e6+;
struct node{
int sum,lsum,num,rsum;
}t[M<<]; void pushup(int rt){
t[rt].num = t[ls].num + t[rs].num;
t[rt].sum = max(t[ls].sum,t[rs].sum);
t[rt].lsum = max(t[ls].lsum,t[rs].lsum+t[ls].num);
t[rt].rsum = max(t[rs].rsum,t[ls].rsum+t[rs].num);
t[rt].sum = max(t[rt].sum,t[ls].rsum+t[rs].lsum);
} void update(int p,int c,int l,int r,int rt){
if(l == r){
t[rt].sum = t[rt].lsum = t[rt].rsum = t[rt].num = c;
return ;
}
int mid = (l + r) >> ;
if(p <= mid) update(p,c,lson);
else update(p,c,rson);
pushup(rt);
} node query(int L,int R,int l,int r,int rt){
if(L<=l&&R>=r){
return t[rt];
}
int mid = (l + r) >> ;
if(R <= mid) return query(L,R,lson);
else if(L > mid) return query(L,R,rson);
else{
node t1 = query(L,R,lson),t2 = query(L,R,rson),ret;
ret.lsum = max(t1.lsum,t2.lsum+t1.num);
ret.rsum = max(t2.rsum,t1.rsum+t2.num);
ret.sum = max(max(t1.sum,t2.sum),t1.rsum+t2.lsum);
return ret;
}
} int main()
{
int n,q,x,y,op;
scanf("%d%d",&n,&q);
for(int i = ;i <= n;i ++)
scanf("%d",&x),update(i,x,,n,);
while(q--){
scanf("%d%d%d",&op,&x,&y);
if(op == ){
if(y < x) swap(x,y);
printf("%d\n",query(x,y,,n,).sum);
}
else{
update(x,y,,n,);
}
}
return ;
}

luogu P4513 小白逛公园 (区间合并)的更多相关文章

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

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

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

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

  3. P4513 小白逛公园

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

  4. 洛谷P4513 小白逛公园

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

  5. P4513 小白逛公园 动态维护最大子段和

    题目链接:https://www.luogu.org/problem/P4513 #include<iostream> #include<cstdio> #include< ...

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

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

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

    传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...

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

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

  9. BZOJ 1756: Vijos1083 小白逛公园

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

随机推荐

  1. Debug .NET Framework Source

    1.Microsoft Reference Source 在线source http://referencesource.microsoft.com/#System.Data.Linq 可以下载离线s ...

  2. 逻辑回归原理 面试 Logistic Regression

    逻辑回归是假设数据服从独立且服从伯努利分布,多用于二分类场景,应用极大似然估计构造损失函数,并使用梯度下降法对参数进行估计.

  3. 数据结构实验之链表六:有序链表的建立(SDUT 2121)

    #include <bits/stdc++.h> using namespace std; struct node { int data; struct node *next; }; in ...

  4. python控制窗口移动(轨迹为圆)

    需先打开一个无标题记事本, import win32con import win32gui import time import math notepad = win32gui.FindWindow( ...

  5. node和npm版本引起的安装依赖和运行项目失败问题

    问题:node版本不同导致的安装依赖版本不同而无法启动 https://www.jianshu.com/p/c07293c8c6d4 实际上问题分为两个部分: 1,npm包管理器安装依赖不成功,此时需 ...

  6. 使用聚集索引和非聚集索引对MySQL分页查询的优化

    内容摘录来源:MSSQL123 ,lujun9972.github.io/blog/2018/03/13/如何编写bash-completion-script/ 一.先公布下结论: 1.如果分页排序字 ...

  7. 使用Xshell链接阿里云服务

    1.下载Xshell,进入xshell官网 https://xshell.en.softonic.com/,选择免费版本进行下载,在该页面https://www.netsarang.com/zh/fr ...

  8. golang的写文件测试

    package main import ( "os" "strings" "time" "fmt" "strc ...

  9. cv常用名词缩写

    lr:learning rate roi:region of interest,可能包含目标的区域. wd:weight decay fps:frame per second,每秒几帧 fine tu ...

  10. 浅谈WebViewClient与WebChromeClient

    简介:WebViewClient被用来传递单纯的加载一个链接时所发生的事件,比如开始加载,结束加载等,它代表这个链接加载时的最普通的和最笼统的事件,WebChromeClient更多的是传递JS对话框 ...