求调悬1关(50pts)

P1253 扶苏的问题

ChpyX2 @ 2024-10-24 17:14:52

rt

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
int n,q;
long long w[maxn];
struct tree{
    int l,r;
    long long w=0,tag=0,tag2=0,tag3=0;
}t[4*maxn];
int ls(int p){
    return p*2;
}
int rs(int p){
    return p*2+1;
}
void push_up(int p){
    t[p].w=max(t[ls(p)].w,t[rs(p)].w);
    return;
}
void addtag(int p,int w){
    t[p].tag+=w;
    t[p].w+=w;
    return;
}
void addtag2(int p,int w){
    t[p].tag2=w;
    t[p].tag3=1;
    t[p].w=w;
    t[p].tag=0;
    return;
}
void push_down(int p){
    if(t[p].tag2!=0||t[p].tag3==1){
        addtag2(ls(p),t[p].tag2);
        addtag2(rs(p),t[p].tag2);
        t[p].tag2=0;
        t[p].tag3=0;
        t[p].tag=0;
    }
    if(t[p].tag){
        addtag(ls(p),t[p].tag);
        addtag(rs(p),t[p].tag);
        t[p].tag=0;
    }
    return;
}
void update(int l,int r,int p,int w){
    int pl=t[p].l,pr=t[p].r;
    if(l<=pl&&pr<=r){
        addtag(p,w);
        return;
    }
    push_down(p);
    int mid=(pl+pr)>>1;
    if(l<=mid)update(l,r,ls(p),w);
    if(r>mid)update(l,r,rs(p),w);
    push_up(p);
    return;
}
void update2(int l,int r,int p,int w){
    int pl=t[p].l,pr=t[p].r;
    if(l<=pl&&pr<=r){
        addtag2(p,w);
        return;
    }
    push_down(p);
    int mid=(pl+pr)>>1;
    if(l<=mid)update2(l,r,ls(p),w);
    if(r>mid)update2(l,r,rs(p),w);
    push_up(p);
    return;
}
void init(int p,int l,int r){
    t[p].l=l;t[p].r=r;
    if(l==r){t[p].w=w[l];return;}
    int mid=(l+r)>>1;
    init(ls(p),l,mid);
    init(rs(p),mid+1,r);
    push_up(p);
    return;
}
long long look(int l,int r,int p){
    int pl=t[p].l,pr=t[p].r;
    if(l<=pl&&pr<=r)return t[p].w;//如果包含此线段则加上
    push_down(p);
    int mid=(pl+pr)>>1;
    return max(((l<=mid) ? look(l,r,ls(p)) : 0),((r>mid) ? look(l,r,rs(p)) : 0));
}
void put(){
    for(int i=1;i<=4*n;i++){
        if(t[i].l+t[i].r==0){
            continue;
        }
        printf("p:%d,l:%d,r:%d,w:%d,tag:%d,ls:%d,rs:%d\n",i,t[i].l,t[i].r,t[i].w,t[i].tag,ls(i),rs(i));
    }
    return;
}
int main(){
    freopen("P1253_6.in","r",stdin);
    freopen("P1253_6_tests.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    init(1,1,n);

    for(int i=1;i<=q;i++){
        long long l,r,p,k;
        scanf("%lld%lld%lld",&p,&l,&r);
        if(p==1){
            scanf("%lld",&k);
            update2(l,r,1,k);
            // put();
        }else if(p==2){
            scanf("%lld",&k);
            update(l,r,1,k);
            // put();
        }else{
            cout<<look(l,r,1)<<'\n';
            // put();
        }
    }
    return 0;
}
//from chpyx2

真不知道哪里错了(((

附WA点(#6)数据:tp


by 湖南省队御用绫厨TM_Sharweek @ 2024-11-12 13:54:03

两个 addtagw 要开 long long


|