50pts 线段树求助

P1253 扶苏的问题

AmaZingFantasy @ 2022-05-05 15:12:19

rt

后五个点WA,样例过。不是溢出的问题。

#include <bits/stdc++.h>
using namespace std;
typedef long long l;
l n,q;
const l maxn=1000005;
l h[maxn],tag[maxn*4],tag2[maxn*4],ma[maxn*4];
void pushup(l p){
    ma[p]=max(ma[p*2],ma[p*2+1]);
}
void buildtree(l p,l L,l R){
    if(L==R){
        ma[p]=h[L];
        return;
    }
    l mid=(L+R)/2;
    buildtree(p*2,L,mid);
    buildtree(p*2+1,mid+1,R);
    pushup(p);
}
void movetag(l p,l d){
    ma[p]+=d;
    tag[p]+=d;
}
void movetag2(l p,l d){
    ma[p]=tag2[p]=d;
}
void pushdown(l p){
    if(tag2[p] < 0x3f3f3f3f3f3f3f3f){
        movetag2(p*2,tag2[p]);
        movetag2(p*2+1,tag2[p]);
        tag2[p]=0x3f3f3f3f3f3f3f3f;
    }else{
        movetag(p*2,tag[p]);
        movetag(p*2+1,tag[p]);
        tag[p]=0;
    }
}
void change(l p,l L,l R,l ql,l qr,l d){
    if(ql <= L && R <= qr){
        movetag(p,d);
        return;
    }
    pushdown(p);
    l mid=(L+R)/2;
    if(mid >= ql){
        change(p*2,L,mid,ql,qr,d);
    }
    if(mid < qr){
        change(p*2+1,mid+1,R,ql,qr,d);
    }
    pushup(p);
}
void change2(l p,l L,l R,l ql,l qr,l d){
    if(ql <= L && R <= qr){
        movetag2(p,d);
        return;
    }
    pushdown(p);
    l mid=(L+R)/2;
    if(mid >= ql){
        change2(p*2,L,mid,ql,qr,d);
    }
    if(mid < qr){
        change2(p*2+1,mid+1,R,ql,qr,d);
    }
    pushup(p);
}
l query(l p,l L,l R,l ql,l qr){
    if(ql <= L && R <= qr){
        return ma[p];
    }
    pushdown(p);
    l ans=0;
    l mid=(L+R)/2;
    if(mid >= ql){
        ans=max(ans,query(p*2,L,mid,ql,qr));
    }
    if(mid < qr){
        ans=max(ans,query(p*2+1,mid+1,R,ql,qr));
    }
    return ans;
}
int main(){
    memset(tag2,0x3f,sizeof(tag2));
    cin>>n>>q;
    for(l i=1;i<=n;i++){
        cin>>h[i];
    }
    buildtree(1,1,n);
    for(l i=1;i<=q;i++){
        l cmd;
        cin>>cmd;
        if(cmd==1){
            l x,y,z;
            cin>>x>>y>>z;
            change2(1,1,n,x,y,z);
        }
        if(cmd==2){
            l x,y,z;
            cin>>x>>y>>z;
            change(1,1,n,x,y,z);
        }
        if(cmd==3){
            l x,y;
            cin>>x>>y;
            cout<<query(1,1,n,x,y)<<endl;
        }
    }
    return 0;
}

by Dream_weavers @ 2022-05-05 15:38:11

@AmaZingFantasy 您先改成这样90分,其他的我再找找


by Dream_weavers @ 2022-05-05 15:51:19

@AmaZingFantasy 然后您把函数加上inline就A了

总结:

1.pushdown和change函数里有些问题

2.query函数里ans取-INF,不要取0

3.程序太慢了要用inline和scanf+printf


|