WA 线段树求调 sto orz!!

P1253 扶苏的问题

_Mikasa @ 2023-04-13 11:30:49

RT 调对我让全机房的人都关注你

#include <bits/stdc++.h>
#define int long long
using namespace std;
const long long MAXN=10000001;
struct tree{
    int l,r,max,la,lc,rev;
}t[MAXN];
int n,m,k,a[MAXN],orz,x,y;
void built(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    t[p].max=-1e18;
    if(l==r){
        t[p].max=a[r];
        return;
    }
    int mid=(l+r)/2;
    built(p/2,l,mid);
    built((p/2)+1,mid+1,r);
    t[p].max=max(t[p/2].max,t[(p/2)+1].max);
    return;
}
void pushdown(int p){
    if(t[p].rev!=0){
        t[p<<1].la=t[(p<<1)+1].la=t[p].la;
        t[p<<1].lc=t[(p<<1)+1].lc=t[p].lc;
        t[p<<1].max=t[(p<<1)+1].max=t[p].la+t[p].lc;
        t[p<<1].rev=t[(p<<1)+1].rev=1;
    }else{
        t[p<<1].la+=t[p].la;
        t[(p<<1)+1].la+=t[p].la;
        t[p<<1].max+=t[p].la;
        t[(p<<1)+1].max+=t[p].la;
    }
    t[p].la=t[p].lc=t[p].rev=0;
    return ;
}
void change(int p,int l,int r,int x){
    if(t[p].r<l||t[p].l>r)
        return ;
    if(l<=t[p].l&&t[p].r<=r){
        t[p].la=0;
        t[p].lc=x;
        t[p].rev=1;
        t[p].max=x;
        return ;
    }
    pushdown(p);
    change(p<<1,l,r,x);
    change((p<<1)+1,l,r,x);
    t[p].max=max(t[p<<1].max,t[(p<<1)+1].max);
    return ;
}
void modify(int p,int l,int r,int x){
    if(t[p].r<l||t[p].l>r)
        return ;
    if(l<=t[p].l&&t[p].r<=r){
        t[p].la+=x;
        t[p].max+=x;
        return ;
    }
    pushdown(p);
    modify(p<<1,l,r,x);
    modify((p<<1)+1,l,r,x);
    t[p].max=max(t[p<<1].max,t[(p<<1)+1].max);
    return ;
}
int query(int p,int l,int r){
    if(t[p].r<l||t[p].l>r)
        return -1e18;
    if(l<=t[p].l&&t[p].r<=r)
        return t[p].max;
    pushdown(p);
    return max(query(p<<1,l,r),query((p<<1)+1,l,r)); 
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    built(1,1,n);
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%lld",&orz,&x,&y);
        if(orz==1){
            scanf("%lld",&k);
            change(1,x,y,k);
        }else if(orz==2){
            scanf("%lld",&k);
            modify(1,x,y,k);
        }
        else
            printf("%lld\n",query(1,x,y));
    }
    return 0;
}

by Nuisdete @ 2023-04-13 11:36:06

@_Mikasa

build 那里建左右儿子的时候儿子编号错了,应该是 p<<1(p<<1)+1

改完能过。


by comcopy @ 2023-04-13 11:38:29

亲爱的,您的build为什么是除二不是乘二?


by _Mikasa @ 2023-04-13 11:38:52

@comcopy 谢谢谢谢关注了


by _Mikasa @ 2023-04-13 11:39:02

@louis_11 谢谢谢谢关注了


|