luogu P4513 小白逛公园 2019.8.2
Posted ryqwe-csy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于luogu P4513 小白逛公园 2019.8.2的主要内容,如果未能解决你的问题,请参考以下文章