AmaZingFantasy @ 2022-05-05 15:12:19
rt
后五个点WA,样例过。不是溢出的问题。
#include <bits/stdc++.h>
using namespace std;
typedef long long l;
l n,q;
const l maxn=1000005;
l h[maxn],tag[maxn*4],tag2[maxn*4],ma[maxn*4];
void pushup(l p){
ma[p]=max(ma[p*2],ma[p*2+1]);
}
void buildtree(l p,l L,l R){
if(L==R){
ma[p]=h[L];
return;
}
l mid=(L+R)/2;
buildtree(p*2,L,mid);
buildtree(p*2+1,mid+1,R);
pushup(p);
}
void movetag(l p,l d){
ma[p]+=d;
tag[p]+=d;
}
void movetag2(l p,l d){
ma[p]=tag2[p]=d;
}
void pushdown(l p){
if(tag2[p] < 0x3f3f3f3f3f3f3f3f){
movetag2(p*2,tag2[p]);
movetag2(p*2+1,tag2[p]);
tag2[p]=0x3f3f3f3f3f3f3f3f;
}else{
movetag(p*2,tag[p]);
movetag(p*2+1,tag[p]);
tag[p]=0;
}
}
void change(l p,l L,l R,l ql,l qr,l d){
if(ql <= L && R <= qr){
movetag(p,d);
return;
}
pushdown(p);
l mid=(L+R)/2;
if(mid >= ql){
change(p*2,L,mid,ql,qr,d);
}
if(mid < qr){
change(p*2+1,mid+1,R,ql,qr,d);
}
pushup(p);
}
void change2(l p,l L,l R,l ql,l qr,l d){
if(ql <= L && R <= qr){
movetag2(p,d);
return;
}
pushdown(p);
l mid=(L+R)/2;
if(mid >= ql){
change2(p*2,L,mid,ql,qr,d);
}
if(mid < qr){
change2(p*2+1,mid+1,R,ql,qr,d);
}
pushup(p);
}
l query(l p,l L,l R,l ql,l qr){
if(ql <= L && R <= qr){
return ma[p];
}
pushdown(p);
l ans=0;
l mid=(L+R)/2;
if(mid >= ql){
ans=max(ans,query(p*2,L,mid,ql,qr));
}
if(mid < qr){
ans=max(ans,query(p*2+1,mid+1,R,ql,qr));
}
return ans;
}
int main(){
memset(tag2,0x3f,sizeof(tag2));
cin>>n>>q;
for(l i=1;i<=n;i++){
cin>>h[i];
}
buildtree(1,1,n);
for(l i=1;i<=q;i++){
l cmd;
cin>>cmd;
if(cmd==1){
l x,y,z;
cin>>x>>y>>z;
change2(1,1,n,x,y,z);
}
if(cmd==2){
l x,y,z;
cin>>x>>y>>z;
change(1,1,n,x,y,z);
}
if(cmd==3){
l x,y;
cin>>x>>y;
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}
by Dream_weavers @ 2022-05-05 15:38:11
@AmaZingFantasy 您先改成这样90分,其他的我再找找
by Dream_weavers @ 2022-05-05 15:51:19
@AmaZingFantasy 然后您把函数加上inline就A了
总结:
1.pushdown和change函数里有些问题
2.query函数里ans取-INF,不要取0
3.程序太慢了要用inline和scanf+printf