luogu P4513 小白逛公园 (区间合并)
链接: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 小白逛公园 (区间合并)的更多相关文章
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- P4513 小白逛公园
题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着 nnn 个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白 ...
- 洛谷P4513 小白逛公园
区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...
- P4513 小白逛公园 动态维护最大子段和
题目链接:https://www.luogu.org/problem/P4513 #include<iostream> #include<cstdio> #include< ...
- 洛谷P4513 小白逛公园 (线段树)
这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用dp,充分利用线段树递归的优势来处理.个人理解:线段树相当于把求整个区间的最大子段和的问题不断划分为很多个小问题,容易解决小问题,然后递 ...
- 2018.07.23 洛谷P4513 小白逛公园(线段树)
传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
随机推荐
- linux系统编程--守护进程,会话,进程组,终端
终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...
- Java程序基本结构
/** * 可以用来自动创建文档的注释 */ public class Hello { public static void main(String[] args) { // 向屏幕输出文本: Sys ...
- Django基础之Session
1. Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的 ...
- jenkins+Maven从SVN上构建项目
一.安装Maven 下载地址:https://maven.apache.org/download.cgi 把下载的安装包解压 tar -xvf apache-maven--bin.tar.gz 配置环 ...
- 苹果系统OSX中Automator批量重命名
Automator,看字面意思就无比强大,[自动机器].有什么能比自动还让人着魔? 答案是没有✔ 如果你用的是mac,如果你有一堆文件要重新整理命名,如果你还在Goole什么"批量重命名软件 ...
- 用itext生成PDF报错:Font 'STSong-Light1' with 'UniGB-UCS2-H' is not recognized.
用itext生成PDF报错,加上try catch捕获到异常是 BaseFont bFont = BaseFont.createFont("STSong-Light1", &quo ...
- 可插拔式后台管理系统(Django)
1.实现效果 研究了下django admin的功能,自己实现了一个简单的可插拔式后台管理系统,方便自定义特殊的功能,而且作为一个独立单独的django app,可以整体拷贝到其他项目中作为后台数据管 ...
- 复杂sql语句集锦
本文主要讲一下笔者在工作中遇到的一些逻辑比较复杂的sql语句,下面是具体写法: SELECT IF ( LOCATE() , NULL, SUBSTRING( link, LOCATE() , IF ...
- 企业SOA架构案例分析
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台. ...
- selenium 常见事件操作
1.文本框输入内容 from selenium import webdriverdriver = webdriver.Chrome(r"C:\Users\Administrator\Desk ...