20分求助

P1253 扶苏的问题

Dream_weavers @ 2022-04-10 21:25:54

1、3AC,其余全WA link 求助QAQ

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f3f;
int n,m,op,l,r,a[N],d;
int t[N<<2],tag[N<<2],mdf[N<<2];

inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}

inline void pushup(int x){
    t[x]=max(t[lc(x)],t[rc(x)]); 
}

inline void pushdown(int x){
    tag[lc(x)]+=tag[x],t[lc(x)]+=tag[x];
    tag[rc(x)]+=tag[x],t[rc(x)]+=tag[x];
    tag[x]=0;
    if(mdf[x]!=INF){
        t[lc(x)]=mdf[lc(x)]=mdf[x],tag[lc(x)]=0;
        t[rc(x)]=mdf[rc(x)]=mdf[x],tag[rc(x)]=0;
        mdf[x]=INF;
    }
}

void bulid(int l,int r,int x){
    mdf[x]=INF;
    if(l==r){
        t[x]=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    bulid(l,mid,lc(x));
    bulid(mid+1,r,rc(x));
    pushup(x);
}

void update(int L,int R,int l,int r,int x,int d){
    if(l>=L&&r<=R){
        t[x]=mdf[x]=d;
        tag[x]=0;
        return;
    }
    pushdown(x);
    int mid=(l+r)>>1;
    if(L<=mid) update(L,R,l,mid,lc(x),d);
    if(mid+1<=R) update(L,R,mid+1,r,rc(x),d);  
    pushup(x);
} 

void add(int L,int R,int l,int r,int x,int d){
    if(l>=L&&r<=R){
        t[x]+=d,tag[x]+=d;
        return;
    }
    pushdown(x);
    int mid=(l+r)>>1;
    if(L<=mid) update(L,R,l,mid,lc(x),d);
    if(mid<R) update(L,R,mid+1,r,rc(x),d);  
    pushup(x);
} 

int query(int L,int R,int l,int r,int x){
    if(l>=L&&r<=R)return t[x];
    pushdown(x);
    int mid=(r+l)>>1;
    int ans=-INF;
    if(L<=mid) ans=max(ans,query(L,R,l,mid,lc(x)));
    if(mid<R) ans=max(ans,query(L,R,mid+1,r,rc(x)));
    return ans;
}

signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    bulid(1,n,1);
    while(m--){
        scanf("%lld%lld%lld",&op,&l,&r);
        if(op==1){
            scanf("%lld",&d);
            update(l,r,1,n,1,d);    
        }else if(op==2){
            scanf("%lld",&d);
            add(l,r,1,n,1,d);
        }else{
            printf("%lld\n",query(l,r,1,n,1)); 
        }
    }
    return 0;
}

by TheSky233 @ 2022-04-10 21:35:06

这个帖子可能有点帮助qwq


by TheSky233 @ 2022-04-10 21:36:59

线段树一生之敌


by hrgd @ 2022-04-10 21:40:45

@Dream_weavers 你把 add 函数最上面一段改成:

if(l>=L&&r<=R){
    t[x]+=d;
    if(mdf[x]==INF)tag[x]+=d;
    else mdf[x]+=d;
    return;
}

by hrgd @ 2022-04-10 21:41:43

@TheSky233 孩子,别着急,往后你的一生之敌还多着。


by ningago @ 2022-04-10 21:43:44

@Dream_weavers

应该是先下传修改在下传增加吧,不然如果两个都有就增加无效了,tag[lson],tag[rson]成0了


by Dream_weavers @ 2022-04-10 21:47:47

@hrgd @ningago 改了没变


by Dream_weavers @ 2022-04-10 21:55:48

我放一个云剪贴板吧,能实时更新link


by ningago @ 2022-04-10 21:55:51

@Dream_weavers

emm,你add里面分治的递归写成update了


by Dream_weavers @ 2022-04-10 21:57:01

@ningago 谢谢大佬们,已经AC了

我tm怎么天天犯低级错误啊


|