线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园

题面:小白逛公园

题解:

对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和)、rsum(同理)和sum……就行了

代码:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #define max(a,b) ((a)>(b)?(a):(b))
 5 using namespace std;
 6 inline int rd(){
 7     int x=0,f=1;char c=getchar();
 8     while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
 9     while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
10     return f*x;
11 }
12 const int maxn=500000+50,maxm=100000+50,inf=1<<30;
13 int N,M,K,P,S,ans,flag;
14 struct Tree{int lsum,rsum,l,r,mx,sum;}t[maxn<<2],now;
15 inline void Pushup(int x){
16     int ls=x<<1,rs=ls|1;
17     t[x].sum=t[ls].sum+t[rs].sum;
18     t[x].lsum=max(t[ls].lsum,t[ls].sum+t[rs].lsum);
19     t[x].rsum=max(t[rs].rsum,t[rs].sum+t[ls].rsum);
20     t[x].mx=max(t[ls].mx,t[rs].mx);
21     t[x].mx=max(t[x].mx,t[ls].rsum+t[rs].lsum);
22     return;
23 }
24 inline void Build(int x,int l,int r){
25     t[x].l=l;t[x].r=r;int mid=(l+r)>>1;
26     if(l==r){
27         t[x].sum=t[x].lsum=t[x].rsum=t[x].mx=rd();
28         return;
29     }
30     Build(x<<1,l,mid);Build(x<<1|1,mid+1,r);
31     Pushup(x);
32     return;
33 }
34 inline void Update(int x,int p,int s){
35     int l=t[x].l,r=t[x].r,mid=(l+r)>>1,ls=x<<1,rs=ls|1;
36     if(l==r&&l==p){
37         t[x].sum=t[x].lsum=t[x].rsum=t[x].mx=s;
38         return;
39     }
40     if(p<=mid)Update(ls,p,s);else Update(rs,p,s);
41     Pushup(x);
42     return;
43 }
44 inline void Query(int x,int ql,int qr){
45     int l=t[x].l,r=t[x].r,mid=(l+r)>>1,ls=x<<1,rs=ls|1;
46     if(ql<=l&&r<=qr){
47         if(flag==-1){
48             flag=0;
49             now.lsum=t[x].lsum;now.rsum=t[x].rsum;
50             now.mx=t[x].mx;now.sum=t[x].sum;
51         }
52         else{
53             int sum,lsum,rsum,mx;
54             sum=now.sum+t[x].sum;
55             lsum=max(now.lsum,now.sum+t[x].lsum);
56             rsum=max(t[x].rsum,now.rsum+t[x].sum);
57             mx=max(now.mx,t[x].mx);
58             mx=max(mx,now.rsum+t[x].lsum);
59             now.sum=sum;now.lsum=lsum;now.rsum=rsum;now.mx=mx;
60         }
61         return;
62     }
63     if(ql<=mid)Query(ls,ql,qr);if(qr>mid)Query(rs,ql,qr);
64     return;
65 }
66 int main(){
67     N=rd();M=rd();
68     Build(1,1,N);
69     while(M--){
70         K=rd();P=rd();S=rd();
71         if(K==1){
72             if(P>S)swap(P,S);
73             flag=-1;
74             Query(1,P,S);
75             ans=now.mx;
76             printf("%d\n",ans);
77         }
78         else Update(1,P,S);
79     }
80     return 0;
81 }

 


By:AlenaNuna

 

posted @ 2019-02-26 21:28  AlenaNuna  阅读(70)  评论(0编辑  收藏