50分求助!

P1253 扶苏的问题

tang_mx @ 2023-08-22 19:19:33

有无大佬帮忙,实在调不出来

#include<iostream>
#include<cstdio>

using namespace std;

const int N=1e6+10;
const long long inf=-1e30;

typedef long long ll;

struct Segment{
    ll l,r,add1,add2,sum,dat;
    #define l(x) tree[x].l
    #define r(x) tree[x].r
    #define add1(x) tree[x].add1
    #define add2(x) tree[x].add2
    #define dat(x) tree[x].dat
}tree[N*4];

ll n,m,a[N];

void build(ll p,ll l,ll r){
    l(p)=l,r(p)=r;add1(p)=inf;
    if(l==r){
        dat(p)=a[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void spread(ll p){
    if(add1(p)!=inf){
        dat(p<<1)=add1(p);
        dat(p<<1|1)=add1(p);
        add1(p<<1)=add1(p);
        add1(p<<1|1)=add1(p);
        add2(p)=add2(p)=0;
        add1(p)=inf;
    }
    else if(add2(p)){
        dat(p<<1)+=add2(p);
        dat(p<<1|1)+=add2(p);
        add2(p<<1)+=add2(p);
        add2(p<<1|1)+=add2(p);
        add2(p)=0;
    }
}

void change(ll p,ll l,ll r,ll k){
    if(l<=l(p)&&r>=r(p)){
        dat(p)=k;
        add1(p)=k;
        add2(p)=0;
        return ;
    }
    ll mid=(l(p)+r(p))>>1;
    spread(p);
    if(l<=mid)change(p<<1,l,r,k);
    if(r>mid)change(p<<1|1,l,r,k);
    dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void addd(ll p,ll l,ll r,ll k){
    if(l<=l(p)&&r>=r(p)){
        dat(p)+=k;
        if(add1(p)==inf)add2(p)+=k;
        else add1(p)=k;
        return ;
    }
    ll mid=(l(p)+r(p))>>1;
    spread(p);
    if(l<=mid)addd(p<<1,l,r,k);
    if(r>mid)addd(p<<1|1,l,r,k);
    dat(p)=max(dat(p<<1),dat(p<<1|1));
}

ll ask(ll p,ll l,ll r){
    if(l<=l(p)&&r>=r(p))return dat(p);
    spread(p);
    ll mid=(l(p)+r(p))>>1;
    ll ans=-(1<<30);
    if(l<=mid)ans=max(ans,ask(p<<1,l,r));//没写ask 乐了 
    if(r>mid)ans=max(ans,ask(p<<1|1,l,r));
    return ans;
}

int main(){
//  freopen("P1253_6.in","r",stdin);
//  freopen("ans1.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,1,n);
    ll opt,x,y,k;
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%ld",&opt,&x,&y);
        if(opt==1){
            scanf("%lld",&k);
            change(1,x,y,k);
        }
        else if(opt==2){
            scanf("%lld",&k);
            addd(1,x,y,k);
        }
        else printf("%lld\n",ask(1,x,y));
    }
    return 0;
}

by tang_mx @ 2023-08-22 21:41:26

@galiyuebing 大佬救救我


by bzzltl @ 2023-08-23 08:39:35

@tang_mx

#include<iostream>
#include<cstdio>

using namespace std;

const int N=1e6+10;
const long long inf=-1e15;

typedef long long ll;

struct Segment{
    ll l,r,add1,add2,sum,dat;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define add1(x) tree[x].add1
#define add2(x) tree[x].add2
#define dat(x) tree[x].dat
}tree[N*4];

ll n,m,a[N];

#define lc p<<1
#define rc p<<1|1

void build(ll p,ll l,ll r){
    l(p)=l,r(p)=r;add1(p)=inf;
    if(l==r){
        dat(p)=a[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void spread(ll p){
    if(add1(p)!=inf){
        dat(p<<1)=add1(p);
        dat(p<<1|1)=add1(p);
        add1(p<<1)=add1(p);
        add1(p<<1|1)=add1(p);
        add2(p<<1)=add2(p<<1|1)=0;//
        add1(p)=inf;
    }
    if(add2(p)){//
        dat(p<<1)+=add2(p);
        dat(p<<1|1)+=add2(p);
        add2(p<<1)+=add2(p);
        add2(p<<1|1)+=add2(p);
        add2(p)=0;
    }
}

void change(ll p,ll l,ll r,ll k){
    if(l<=l(p)&&r>=r(p)){
        dat(p)=k;
        add1(p)=k;
        add2(p)=0;
        return ;
    }
    ll mid=(l(p)+r(p))>>1;
    spread(p);
    if(l<=mid)change(p<<1,l,r,k);
    if(r>mid)change(p<<1|1,l,r,k);
    dat(p)=max(dat(p<<1),dat(p<<1|1));
}

void addd(ll p,ll l,ll r,ll k)
{
    if(l<=l(p)&&r>=r(p))
    {
        dat(p)+=k;//
        add2(p)+=k;
        return ;
    }
    ll mid=(l(p)+r(p))>>1;
    spread(p);
    if(l<=mid)addd(lc,l,r,k);
    if(r>mid)addd(rc,l,r,k);
    dat(p)=max(dat(lc),dat(rc));
}

ll ask(ll p,ll l,ll r){
    if(l<=l(p)&&r>=r(p))return dat(p);
    spread(p);
    ll mid=(l(p)+r(p))>>1;
    ll ans=inf;//
    if(l<=mid)ans=max(ans,ask(lc,l,r));
    if(r>mid)ans=max(ans,ask(rc,l,r));
    return ans;
}

int main(){
//  freopen("P1253_7.in","r",stdin);
//  freopen("1.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,1,n);
    ll opt,x,y,k;
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%ld",&opt,&x,&y);
        if(opt==1){
            scanf("%lld",&k);
            change(1,x,y,k);
        }
        else if(opt==2){
            scanf("%lld",&k);
            addd(1,x,y,k);
        }
        else printf("%lld\n",ask(1,x,y));
    }
    return 0;
}

by bzzltl @ 2023-08-23 08:40:41

@tang_mx 马蜂改改吧,改不动直接


by bzzltl @ 2023-08-23 08:44:36

强烈建议改马蜂,还有宏定义,调代码调得心态都要崩了


by tang_mx @ 2023-08-23 12:31:45

@bzzltl 马蜂跟李煜东学的QAQ


by tang_mx @ 2023-08-23 12:45:28

@bzzltl 非常感谢!


|