zoukankan      html  css  js  c++  java
  • 线段树 || 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
    ",ans);
    77         }
    78         else Update(1,P,S);
    79     }
    80     return 0;
    81 }

    By:AlenaNuna

  • 相关阅读:
    2016级算法第四次上机-B ModricWang的序列问题
    2016级算法第四次上机-A.Bamboo 和人工zz
    2016级算法第三次上机-G.Winter is coming
    2016级算法第三次上机-F.ModricWang的导弹防御系统
    2016级算法第三次上机-E.ModricWang's Polygons
    2016级算法第三次上机-D.双十一的抉择
    2016级算法第三次上机-C.AlvinZH的奇幻猜想——三次方
    2016级算法第三次上机-B.Bamboo和巧克力工厂
    2016级算法第三次上机-A.Bamboo的小吃街
    Self-introduction 自我介绍
  • 原文地址:https://www.cnblogs.com/AlenaNuna/p/10440300.html
Copyright © 2011-2022 走看看