【vijos】P1083 小白逛公园

【算法】线段树

【题解】

学自:https://vijos.org/p/1083/solution(wang_yanheng的回答)

回溯时维护一段区间的以下域:

  • sumL:从左端点起连续区间的最大和
  • sumR:从右端点起连续区间的最大和
  • sum:整段区间的和
  • subSum:最大子区间和

以上域在叶子节点中的值,都等于节点代表公园的评分
设当前节点为 x,左孩子为 l,右孩子为 r。则:

x.sumL = MAX(l.sumL, l.sum + r.sumL);
x.sumR = MAX(r.sumR, r.sum + l.sumR);
x.sum = l.sum + r.sum;
x.subSum = MAX(l.subSum, r.subSum, l.sumR + r.sumL);以上计算过程可以写成函数,参数结构体,返回结构体。查询时要返回结构体。

#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f,maxn=500010;
struct cyc{int lsum,rsum,sum,subsum;}t[maxn*3];
int a[maxn],L[maxn*3],R[maxn*3],n,m;
cyc calc(cyc a,cyc b)
{
    cyc c;
    c.lsum=max(a.lsum,a.sum+b.lsum);
    c.rsum=max(b.rsum,b.sum+a.rsum);
    c.sum=a.sum+b.sum;
    c.subsum=max(a.subsum,max(b.subsum,a.rsum+b.lsum));
    return c;
}
void build(int k,int l,int r)
{
    L[k]=l;R[k]=r;
    if(l==r)t[k]={a[l],a[l],a[l],a[l]};
     else
      {
         int mid=(l+r)>>1;
         build(k<<1,l,mid);
         build(k<<1|1,mid+1,r);
         t[k]=calc(t[k<<1],t[k<<1|1]);
      }
}
void update(int k,int x,int num)
{
    int left=L[k],right=R[k];
    if(left==right)t[k]={num,num,num,num};
     else
      {
         int mid=(left+right)>>1;
         if(x<=mid)update(k<<1,x,num);
          else update(k<<1|1,x,num);
         t[k]=calc(t[k<<1],t[k<<1|1]);
      }
}
cyc ask(int k,int l,int r)
{
    int left=L[k],right=R[k];
    if(l<=left&&right<=r)return t[k];
     else
      {
          int mid=(left+right)>>1;
          if(l>mid)return ask(k<<1|1,l,r);
          if(r<=mid)return ask(k<<1,l,r);
          return calc(ask(k<<1,l,r),ask(k<<1|1,l,r));
      }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
     {
         int k,b,c;
         scanf("%d%d%d",&k,&b,&c);
         if(k==1)
          {
              if(b>c)swap(b,c);
            printf("%d\n",ask(1,b,c).subsum);
         }
        else update(1,b,c);
     }
}

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

【vijos】P1083 小白逛公园的相关文章

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

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

线段树--小白逛公园nkoj1316

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

TYVJ1427 小白逛公园

P1427 小白逛公园 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着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 小白逛公园 线段树加DP

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

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

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

P1427 小白逛公园

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

bzoj1756(vijos1083)--小白逛公园--线段树

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