题面:小白逛公园

题解:

对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护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 小白逛公园的更多相关文章

  1. 【Vijos1083/BZOJ1756】小白逛公园(线段树)

    [写在前面]TYC (Little White) 真是太巨啦! 题目: Vijos1083 分析: 一眼看上去就是线段树啊-- 然而当我这种蒟蒻兴高采烈地把线段树模板敲了一半,却发现一个问题: 这子区 ...

  2. 【线段树】bzoj1756 Vijos1083 小白逛公园

    我们知道,求一段序列的最大子段和是O(n)的,但是这样是显然会超时的. 我们需要一个数据结构来支持修改和计算的操作,对于这种修改一个而查询区间的问题,考虑使用线段树. 在线段树中,除了左端点,右端点, ...

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

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

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

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

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

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

  6. 【BZOJ】1756: Vijos1083 小白逛公园(线段树)

    题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀  区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...

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

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

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

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

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

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

随机推荐

  1. vs visual stdio 调试 显示指针为数组

    假如有这样一个指针 int *  idx16  那么要想在调试里面显示为数组并且要显示的数组元素个数为24的话,则要写成idx16,24 如下图

  2. ###My SQL Date相关函数

    ###My SQL Date相关函数 #获得当前日期时间 select now(); #date_format(date,format) select date_format('2008-08-08 ...

  3. Apache与php快速部署web服务

    [本文出自天外归云的博客园] 在一台服务器上临时起个web服务,读取服务器上的cfs文件内容并显示在页面上,做一个简单的web请求处理. 首先找到apache,在conf文件夹下vi httpd.co ...

  4. MySQL: Set user variable from result of query

    set @user = 123456;set @group = (select GROUP from USER where User = @user);select * from USER where ...

  5. go module下golang.org如何处理被墙

    一.系统提示 go: golang.org/x/sys@v0.0.0-20180905080454-ebe1bf3edb33: unrecognized import path "golan ...

  6. JS保留两位小数的几种方法

    四舍五入 以下处理结果会四舍五入: var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45 不四舍五入 以下处理结果不会四舍五入: 第一种, ...

  7. HTTP 07 追加协议与 Ajax

    Ajax 解决方法 是一种有效的利用 JavaScript 和 DOM 的操作, 以达到局部Web 页面替换加载异步的通信手段.以达到局部web页面替换加载异步通信手段.和以前的同步通信相比, 由于它 ...

  8. GoLang之错误处理

    错误处理 error Go语言引入了一个错误处理的标准模式,即error接口,该接口定义如下: type error interface { Error() string } 对于大多数函数,如果要返 ...

  9. 【转】app之YdbOnline说明文档

    概述 YdbOnline是面向网页开发者提供的网页开发工具包. 通过使用YdbOnline,网页开发者可借助YdbOnline高效地使用语音.位置等手机系统的能力,同时可以直接使用清除缓存.扫一扫等A ...

  10. python 解除装饰器,调用原本函数。

    假设fun函数被装饰器装饰了,name调用fun,就不是调用fun本身了,那么如何继续调用本身呢.使用fun_raw = fun.__wrapped__这样使用fun_raw就是调用没被装饰器修饰后的 ...