线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园
题解:
对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和)、rsum(同理)和sum……就行了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=+,maxm=+,inf=<<;
int N,M,K,P,S,ans,flag;
struct Tree{int lsum,rsum,l,r,mx,sum;}t[maxn<<],now;
inline void Pushup(int x){
int ls=x<<,rs=ls|;
t[x].sum=t[ls].sum+t[rs].sum;
t[x].lsum=max(t[ls].lsum,t[ls].sum+t[rs].lsum);
t[x].rsum=max(t[rs].rsum,t[rs].sum+t[ls].rsum);
t[x].mx=max(t[ls].mx,t[rs].mx);
t[x].mx=max(t[x].mx,t[ls].rsum+t[rs].lsum);
return;
}
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;int mid=(l+r)>>;
if(l==r){
t[x].sum=t[x].lsum=t[x].rsum=t[x].mx=rd();
return;
}
Build(x<<,l,mid);Build(x<<|,mid+,r);
Pushup(x);
return;
}
inline void Update(int x,int p,int s){
int l=t[x].l,r=t[x].r,mid=(l+r)>>,ls=x<<,rs=ls|;
if(l==r&&l==p){
t[x].sum=t[x].lsum=t[x].rsum=t[x].mx=s;
return;
}
if(p<=mid)Update(ls,p,s);else Update(rs,p,s);
Pushup(x);
return;
}
inline void Query(int x,int ql,int qr){
int l=t[x].l,r=t[x].r,mid=(l+r)>>,ls=x<<,rs=ls|;
if(ql<=l&&r<=qr){
if(flag==-){
flag=;
now.lsum=t[x].lsum;now.rsum=t[x].rsum;
now.mx=t[x].mx;now.sum=t[x].sum;
}
else{
int sum,lsum,rsum,mx;
sum=now.sum+t[x].sum;
lsum=max(now.lsum,now.sum+t[x].lsum);
rsum=max(t[x].rsum,now.rsum+t[x].sum);
mx=max(now.mx,t[x].mx);
mx=max(mx,now.rsum+t[x].lsum);
now.sum=sum;now.lsum=lsum;now.rsum=rsum;now.mx=mx;
}
return;
}
if(ql<=mid)Query(ls,ql,qr);if(qr>mid)Query(rs,ql,qr);
return;
}
int main(){
N=rd();M=rd();
Build(,,N);
while(M--){
K=rd();P=rd();S=rd();
if(K==){
if(P>S)swap(P,S);
flag=-;
Query(,P,S);
ans=now.mx;
printf("%d\n",ans);
}
else Update(,P,S);
}
return ;
}
By:AlenaNuna
线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园的更多相关文章
- 【Vijos1083/BZOJ1756】小白逛公园(线段树)
[写在前面]TYC (Little White) 真是太巨啦! 题目: Vijos1083 分析: 一眼看上去就是线段树啊-- 然而当我这种蒟蒻兴高采烈地把线段树模板敲了一半,却发现一个问题: 这子区 ...
- 【线段树】bzoj1756 Vijos1083 小白逛公园
我们知道,求一段序列的最大子段和是O(n)的,但是这样是显然会超时的. 我们需要一个数据结构来支持修改和计算的操作,对于这种修改一个而查询区间的问题,考虑使用线段树. 在线段树中,除了左端点,右端点, ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- 2018.07.23 洛谷P4513 小白逛公园(线段树)
传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...
- 【BZOJ】1756: Vijos1083 小白逛公园(线段树)
题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀 区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- 洛谷P4513 小白逛公园 (线段树)
这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用dp,充分利用线段树递归的优势来处理.个人理解:线段树相当于把求整个区间的最大子段和的问题不断划分为很多个小问题,容易解决小问题,然后递 ...
随机推荐
- 【原】Linux环境下Shell调用MySQL并实现定时任务
对于一些周期性事务,我们可以在Linux下,使用shell脚本调用mysql数据库存储过程,并设置定时任务. 本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...使用cron ...
- Ubuntu18.04下可以完美运行Quake3 Arena
安装 其实很早就知道Linux下面可以跑Quake3, 但是一直没有付诸行动, 在硬盘上躺了很多年的Quake III Arena, 和Brood一起从来不舍得删, 昨天终于想起来试试. 安装很简单, ...
- java mqtt
代码: package cc.gongchang.mqtt; import java.net.URISyntaxException; import org.fusesource.hawtdispatc ...
- NetCore指令集和
1.查看当前目录的版本号 C:\Users\Administrator>dotnet --version 1.0.4 2.发布程式,进入到指定目录 dotnet publish 3.运行程式 # ...
- Unable to find IPv4-only network bridge for LXD.
https://github.com/conjure-up/conjure-up/issues/1440It seems like the the installation is complainin ...
- Linux好用的工具命令 - rz/sz
Linux系统中将本地的文件上传到服务器或者从服务器上下载文件到本地可以通过安装lrzsz工具来简单便利的完成. >>RZ :将本地的文件上传到服务器 >>SZ:从服务器上下载 ...
- vue及ElementUI环境搭建
1. nodejs安装及npm安装 下载地址:https://nodejs.org/en/download/ 选择windows Installer 下载完成后 运行node-v8.11.1-x64. ...
- jQuery雷达扫描切换幻灯片代码
基于jQuery雷达扫描切换幻灯片代码.这是一款切换效果类似雷达扫描,支持鼠标滚轮滚动切换.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=" ...
- extjs ajax 同步 及 confirm 确认提示框问题
//上传文件 uploadModel: function() { if(Ext.getCmp('exup').getForm().isValid()) { var ssn = this.upPanel ...
- Virtual配置
没有ifconfig yum upgrade yum install net-tools yum源配置: https://jingyan.baidu.com/article/215817f7aef2e ...