线段树 || 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,充分利用线段树递归的优势来处理.个人理解:线段树相当于把求整个区间的最大子段和的问题不断划分为很多个小问题,容易解决小问题,然后递 ...
随机推荐
- SpringBoot项目获取ApplicationContext来GetBean的方法
一.简介 我们开发时,经常遇到有些实例需要动态创建,比如有构造函数的组件等.这时候,Spring时我们有ClassPathXmlApplicationContext,但是在Spring Boot时,我 ...
- n2n的编译和运行、配置
交叉编译: cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake -build ./ ../ 1.n2n 基于p ...
- 面向服务的体系架构(SOA)
面向服务的体系架构(SOA) 1.面向服务的体系架构(SOA) 面向服务的架构(service-oriented architecture)是Gartner于2O世纪9O年代中期提出的面向服务架构的概 ...
- Oracle 11g透明网关连接Sqlserver
Oracle 11g透明网关连接Sqlserver oracle 透明网关是oracle连接异构数据库提供的一种技术.通过Gateway,可以在Oracle里透明的访问其他不同的数据库,如SQL Se ...
- Faiss安装
一.上策:使用现成的faiss 找到别人(同事或同学)的python目录,找到faiss文件夹,复制到本地,并将其添加到PYTHONPATH下. 二.中策:使用anaconda anaconda上面的 ...
- 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-cod ...
- [转]论SOA架构的几种主要开发方式
面向服务架构soa以其独特的优势越来越受到企业的重视,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理 ...
- springboot2.x接口返回中文乱码
@Configuration public class GlobalConversConfiguration extends WebMvcConfigurationSupport { @Bean pu ...
- Spring-boot之 swagger2
Swagger是一个简单但功能强大的API表达工具. 结合springboot 配置起来很简单,附上教程 :https://www.xncoding.com/2017/07/08/spring/sb- ...
- 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其三)
除了上一篇中提到的对字符串的字符替换操作,去掉Json中的转义符反斜杠\之外,还发现了更加简单的办法. 就是使用Newtownsoft.Json序列化Json时,将嵌套的Json对象(字符串)转为JO ...