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';
}
}
}
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_啊对还有把变量名都改的很长很长