萌新线段树 9分 求助

P4513 小白逛公园

Emplace_back @ 2022-07-18 12:00:21

只对了#1

调了一上午也不明白哪里出问题了qwq

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,Inf=9223372036854775807;
char cch;
int res,zf;
inline int rd()
{
    while((cch=getchar())<45);
    if(cch^45)res=cch^48,zf=1;
    else res=0,zf=-1;
    while((cch=getchar())>=48)res=(res*10)+(cch^48);
    return res*zf;
}

int n=rd(),T=rd();
struct Tree
{
    int l,r;
    int mx,mxl,mxr;
    int sum;
}t[N<<2];

inline void pushup(int u)
{
    t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
    t[u].mx=max(max(t[u<<1].mx,t[u<<1|1].mx),t[u<<1].mxr+t[u<<1|1].mxl);
    t[u].mxl=max(t[u<<1].mxl,t[u<<1].sum+t[u<<1|1].mxl);
    t[u].mxr=max(t[u<<1|1].mxr,t[u<<1|1].sum+t[u<<1].mxr);
}

inline void build(int u,int l,int r)
{
    t[u].l=l,t[u].r=r;
    if(l==r)
    {
        t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=rd();
        return;
    }
    int mid=(t[u].l+t[u].r)>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}

inline void update(int u,int p,int k)
{
    if(t[u].l==t[u].r)
    {
        t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=k;
        return;
    }
    int mid=(t[u].l+t[u].r)>>1;
    if(mid>=p) update(u<<1,p,k);
    else update(u<<1|1,p,k);
    pushup(u);
}

inline int query(int u,int l,int r)
{
    if(l<=t[u].l&&r>=t[u].r) return t[u].mx;
    int mid=(t[u].l+t[u].r)>>1,mx=-Inf;
    if(l<=mid) mx=query(u<<1,l,r);
    if(r>mid) mx=max(mx,query(u<<1|1,l,r));
    return mx;
}

int opt;
int kl,kr;
signed main()
{
    build(1,1,n);
    while(T--)
    {
        opt=rd();
        kl=rd(),kr=rd();
        switch(opt)
        {
            case 1:if(kl>kr)swap(kl,kr);cout<<query(1,kl,kr)<<'\n';break;
            case 2:update(1,kl,kr);break;
        }
    }
    return 0;
}

by Emplace_back @ 2022-07-18 12:03:04

Hack:

50 5
773
760
-578
-302
-664
272
367
352
891
-569
429
-208
-325
38
148
456
-960
-390
470
271
763
-458
-52
647
-205
-514
399
-611
882
665
257
-718
233
-756
237
-301
650
148
-894
-212
-820
-341
-240
-620
320
932
-498
-252
323
-428
2 5 818
1 35 49
2 15 -87
1 31 48
1 44 37    <=

正确答案:798

我的答案:650

差了个38号位上的148


by sprads @ 2022-07-18 12:32:34

@Penggeng query 写错啦,你 pushup 的合并两块在询问时也要用啊,否则答案肯定偏小啊


by sprads @ 2022-07-18 12:33:24

@sprads query 也要合并得到的两块的信息


by sprads @ 2022-07-18 12:34:27

@sprads 合并方式和 pushup 类似,query 返回结构体 Tree 类型


by Emplace_back @ 2022-07-18 12:54:08

感谢!


|