线段树50pts求条,玄关qwq

P1253 扶苏的问题

Lain_yc @ 2024-11-26 09:25:05

#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+5;
struct tree{
    long long l,r,data,addl,chl;
}t[N<<2];
long long n,m,a[N];
long long ls(long long p){
    return p<<1;
}
long long rs(long long p){
    return p<<1|1;
}
void pushup(long long p){
    t[p].data=max(t[ls(p)].data,t[rs(p)].data);
}
void pushdownc(long long p){
    if(t[p].chl!=-0x3f3f3f3f){
        t[ls(p)].addl=0;
        t[rs(p)].addl=0;
        t[ls(p)].data=t[rs(p)].data=t[p].chl;
        t[ls(p)].chl=t[rs(p)].chl=t[p].chl;
        t[p].chl=-0x3f3f3f3f;
    }
}
void pushdowna(long long p){
    if(t[p].addl){
        pushdownc(p);
        t[ls(p)].data+=t[p].addl;
        t[rs(p)].data+=t[p].addl;
        t[ls(p)].addl+=t[p].addl;
        t[rs(p)].addl+=t[p].addl;
        t[p].addl=0;
    }
}
void pushdown(long long p){
    pushdownc(p);
    pushdowna(p);
}
void build(long long p,long long l,long long r){
    t[p].l=l;t[p].r=r;
    t[p].chl=-0x3f3f3f3f;
    t[p].addl=0;
    if(t[p].l==t[p].r){
        t[p].data=a[l];
        return ;
    }
    long long mid=(t[p].l+t[p].r)/2;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    pushup(p);
}
void add(long long p,long long l,long long r,long long k){
    if(t[p].l>=l&&t[p].r<=r){
        pushdownc(p);
        t[p].addl+=k;
        t[p].data+=k;
        return ;
    }
    pushdown(p);
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) add(ls(p),l,r,k);
    if(mid<r) add(rs(p),l,r,k);
    pushup(p);
}
void change(long long p,long long l,long long r,long long k){
    if(t[p].l>=l&&t[p].r<=r){
        t[p].chl=k;
        t[p].data=k;
        t[p].addl=0;
        return ;
    }
    pushdown(p);
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) change(ls(p),l,r,k);
    if(mid<r) change(rs(p),l,r,k);
    pushup(p);
}
long long query(long long p,long long l,long long r){
    if(t[p].l>=l&&t[p].r<=r){
        return t[p].data;
    }
    pushdown(p);
    long long ans=-0x7fffffff;
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) ans=max(ans,query(ls(p),l,r));
    if(mid<r) ans=max(ans,query(rs(p),l,r));
    return ans;
}
int main(){
    cin>>n>>m;
    for(long long i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(m--){
        long long o,k,u,v;
        cin>>o>>u>>v;
        if(o==1){
            cin>>k;
            change(1,u,v,k);
        }
        else if(o==2){
            cin>>k;
            add(1,u,v,k);
        }
        else if(o==3){
            cout<<query(1,u,v)<<'\n';
        }
    }
}

6#7#8#9WA,#10RE,使用AI调了但是并无【】用,故求助谷民


by Lain_yc @ 2024-11-26 09:26:27

经检验,并非厌氧代码


by r2bxyy @ 2024-11-26 09:57:09

INF开太小了,导致很多地方本来应该是比-0x3f3f3f3f更小的数变成了-0x3f3f3f3f,还有最后一个点RE很玄学,改成2e6就过了(?\ 最后最后一个点会超时,加个

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

就AC了 Code:

#include<bits/stdc++.h>
using namespace std;
const long long N=2e6+9;
long long INF=0x3f3f3f3f;
struct tree{
    long long l,r,data,addl,chl;
}t[N<<2];
long long n,m,a[N];
long long ls(long long p){
    return p<<1;
}
long long rs(long long p){
    return p<<1|1;
}
void pushup(long long p){
    t[p].data=max(t[ls(p)].data,t[rs(p)].data);
}
void pushdownc(long long p){
    if(t[p].chl!=-INF){
        t[ls(p)].addl=0;
        t[rs(p)].addl=0;
        t[ls(p)].data=t[rs(p)].data=t[p].chl;
        t[ls(p)].chl=t[rs(p)].chl=t[p].chl;
        t[p].chl=-INF;
    }
}
void pushdowna(long long p){
    if(t[p].addl){
        pushdownc(p);
        t[ls(p)].data+=t[p].addl;
        t[rs(p)].data+=t[p].addl;
        t[ls(p)].addl+=t[p].addl;
        t[rs(p)].addl+=t[p].addl;
        t[p].addl=0;
    }
}
void pushdown(long long p){
    pushdownc(p);
    pushdowna(p);
}
void build(long long p,long long l,long long r){
    t[p].l=l;t[p].r=r;
    t[p].chl=-INF;
    t[p].addl=0;
    if(t[p].l==t[p].r){
        t[p].data=a[l];
        return ;
    }
    long long mid=(t[p].l+t[p].r)/2;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    pushup(p);
}
void add(long long p,long long l,long long r,long long k){
    if(t[p].l>=l&&t[p].r<=r){
        pushdownc(p);
        t[p].addl+=k;
        t[p].data+=k;
        return ;
    }
    pushdown(p);
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) add(ls(p),l,r,k);
    if(mid<r) add(rs(p),l,r,k);
    pushup(p);
}
void change(long long p,long long l,long long r,long long k){
    if(t[p].l>=l&&t[p].r<=r){
        t[p].chl=k;
        t[p].data=k;
        t[p].addl=0;
        return ;
    }
    pushdown(p);
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) change(ls(p),l,r,k);
    if(mid<r) change(rs(p),l,r,k);
    pushup(p);
}
long long query(long long p,long long l,long long r){
    if(t[p].l>=l&&t[p].r<=r){
        return t[p].data;
    }
    pushdown(p);
    long long ans=-INF;
    long long mid=(t[p].l+t[p].r)/2;
    if(l<=mid) ans=max(ans,query(ls(p),l,r));
    if(mid<r) ans=max(ans,query(rs(p),l,r));
    return ans;
}
int main(){
//  freopen("P1253_7.in","r",stdin);
//  freopen("P1253.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    INF=INF*INF;
    cin>>n>>m;
    for(long long i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(m--){
        long long o,k,u,v;
        cin>>o>>u>>v;
        if(o==1){
            cin>>k;
            change(1,u,v,k);
        }
        else if(o==2){
            cin>>k;
            add(1,u,v,k);
        }
        else if(o==3){
            cout<<query(1,u,v)<<'\n';
        }
    }
}

by r2bxyy @ 2024-11-26 09:57:33

@Lain_yc


by Lain_yc @ 2024-11-26 10:03:08

@r2bxyy%%%,感谢大佬,已关awa


by Ginka_ @ 2024-11-26 10:28:59

用的什么ai@Lain_yc


by Lain_yc @ 2024-11-26 10:34:45

@Ginka_豆包,做出的最大贡献就是把我的#difine int long long给改成了定义时候的long long然后把main函数改成了int((


by Lain_yc @ 2024-11-26 10:39:42

@Ginka_啊对还有把变量名都改的很长很长


|