luogu P4513 小白逛公园 2019.8.2

2019.8.2//by AndyZ
#include<cstdio>
#include<iostream>
#define rint register int
#define ls p<<1
#define rs p<<1|1
using namespace std;
const int N=5e5+5;
int n,m;
int a[N];
struct SegmentTree{
	int l,r,dat;
	int lmax,rmax,maxn;
}t[N*4];
int read(){
	int f=1,x=0;char ch;
	while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
	return f*x;
}
void pushup(int p){
	t[p].dat=t[ls].dat+t[rs].dat;
	t[p].lmax=max(t[ls].dat+t[rs].lmax,t[ls].lmax);
	t[p].rmax=max(t[rs].dat+t[ls].rmax,t[rs].rmax);
	t[p].maxn=max(max(t[ls].maxn,t[rs].maxn),t[ls].rmax+t[rs].lmax);
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){t[p].dat=t[p].maxn=t[p].lmax=t[p].rmax=a[l];return ;}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
void add(int p,int x,int k){
	if(t[p].l==t[p].r){
		t[p].dat=t[p].lmax=t[p].rmax=t[p].maxn=k;
		return;
	}
	int mid=(t[p].l+t[p].r)/2;
	if(mid>=x){
		add(ls,x,k);
	}else add(rs,x,k);
	pushup(p);
}
SegmentTree ask(int p,int l,int r){
	if(t[p].l>=l&&t[p].r<=r) return t[p];
	int mid=(t[p].l+t[p].r)/2;
	if(r<=mid) return ask(ls,l,r);
	else if(l>mid) return ask(rs,l,r);
	else{
		SegmentTree L=ask(ls,l,r),R=ask(rs,l,r),ans;
		ans.dat = L.dat + R.dat ;
		ans.lmax = max(L.dat + R.lmax, L.lmax );
		ans.rmax = max(R.dat + L.rmax, R.rmax );
		ans.maxn = max(max(L.maxn , R.maxn ),L.rmax + R.lmax );
		return ans;
	}
}
int main(){
	n=read(),m=read();
	for(rint i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	for(rint i=1;i<=m;i++){
		int opt=read();
		if(opt==1){
			int a=read(),b=read();
			if(a>b) swap(a,b);
			printf("%d\n",ask(1,a,b).maxn );
		}else{
			int a=read(),b=read();
			add(1,a,b);
		}
	}
	return 0;
}

  线段树单点修改 + 区间合并 注意pushup

原文地址:https://www.cnblogs.com/Ryqwe-csy/p/11290236.html

时间: 2024-08-03 07:12:36

luogu P4513 小白逛公园 2019.8.2的相关文章

$Luogu$ $P4513$ 小白逛公园

链接 背景 \(huhao\) , \(Luogu\) \(P4513\) 题意 给定一个数列,要求单点修改.区间查询最大子段和. 解法 线段树模板.维护每个区间和 \(sum\) .区间最大子段和 \(val\) .区间从左端点开始向右的最大子段和 \(lmax\) .区间从右端点开始向左的最大子段和 \(rmax\) . \(trick\) 查询时先加入一个节点,后来查询到的节点直接与该节点比较更新即可. 细节 \(1.\) 建树和修改时各个信息均要赋值.(好傻逼的错误啊) \(2.\) 查

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<

TYVJ1427 小白逛公园

P1427 小白逛公园 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了.    一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯

线段树--小白逛公园nkoj1316

小白逛公园 Time Limit:20000MS  Memory Limit:65536K Case Time Limit:2000MS Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的

JDOJ-1260: VIJOS-P1083 小白逛公园

1260: VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 329  Solved: 94[Submit][Status][Web Board] Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了.         一开始,小白就根据公园的风景给每个公园打了分.小新为了省事,每次遛狗的时候

bzoj1756 Vijos1083 小白逛公园

1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MB Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白

Vijos 1083 小白逛公园(线段树)

线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<

Vijos 小白逛公园 线段树加DP

描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择**连续**的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白选择公园吧

【BZOJ】1756【VIJOS】1083小白逛公园

描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白选择公园