50分代码求调/(ㄒoㄒ)/~~
查看原帖
50分代码求调/(ㄒoㄒ)/~~
866144
holo_23楼主2024/12/5 09:47

看了半天不知道错哪了,求佬调

#include "iostream"
#include "vector"
#define ll long long
using namespace std;
typedef struct tree_node{
    ll l,r;
    ll sum,add,change_num;
    bool is_change=0;
};

tree_node tree[4000100];
ll nums[1000100];


void mark_tag(int p,ll add,ll change_num,bool is_change){
    //如果change了,则add=0

    //先change,后add 
    //先add,后change
    if(is_change){
        tree[p].sum=change_num+add;
        tree[p].change_num=change_num;
        tree[p].add = add;
        tree[p].is_change=true;
    }
    else{
        tree[p].add += add;
        tree[p].sum += add;
    }
}


void push_up(int p){
    tree[p].sum= max(tree[p*2].sum,tree[p*2+1].sum);
}

void push_down(int p){
    mark_tag(p*2,tree[p].add,tree[p].change_num,tree[p].is_change);
    mark_tag(p*2+1,tree[p].add,tree[p].change_num,tree[p].is_change);
    tree[p].add=0;
    tree[p].is_change=false;
}


void build_tree(ll l,ll r,ll p){
    tree[p].l=l;
    tree[p].r=r;
    if(l==r){
        tree[p].sum=nums[l];
        return;
    }
    ll mid= (l+r)/2;
    build_tree(l,mid,p*2);
    build_tree(mid+1,r,p*2+1);
    push_up(p);
   
}


void update_add(ll target_l,ll target_r,ll d,ll p){
    ll r=tree[p].r,l=tree[p].l;
    if(r<target_l || l>target_r){
        return ;
    }
    if(l>=target_l && r<=target_r){
        mark_tag(p,d,tree[p].change_num,false);
        return;
    }
    push_down(p);
    update_add(target_l,target_r,d,p*2);
    update_add(target_l,target_r,d,p*2+1);
    push_up(p);
}

void update_change(ll target_l,ll target_r,ll d,ll p){
    ll r=tree[p].r,l=tree[p].l;
    if(r<target_l || l>target_r){
        return ;
    }
    if(l>=target_l && r<=target_r){
        mark_tag(p,0,d,true);
        return;
    }
    push_down(p);
    update_change(target_l,target_r,d,p*2);
    update_change(target_l,target_r,d,p*2+1);
    push_up(p);
}

ll get_sum(ll target_l,ll target_r,ll p){
    ll r=tree[p].r,l=tree[p].l;
    if(r<target_l || l>target_r){
        return 0;
    }
    if(l>=target_l && r<=target_r){
        return tree[p].sum;
    }
    push_down(p);
    return max(get_sum(target_l,target_r,p*2),get_sum(target_l,target_r,p*2+1));
}


int main(){
    ll n,q;
    std::ios::sync_with_stdio(false);
    cin>>n>>q;
    for(ll i=1;i<=n;i++){
        cin>>nums[i];
    }
    build_tree(1,n,1);
    for(ll i=0;i<q;++i){
        ll op;
        cin>>op;
        if(op==1){
            ll l,r,d;
            cin>>l>>r>>d;
            update_change(l,r,d,1);
        }
        else if(op==2){
            ll l,r,d;
            cin>>l>>r>>d;
            update_add(l,r,d,1);
        }
        else{
            ll l,r;
            cin>>l>>r;
            cout<<get_sum(l,r,1)<<endl;
        }
    }
}
2024/12/5 09:47
加载中...