zhyn @ 2024-08-12 09:15:51
样例已过,但后5个点全WA,每次到输出负数的时候输出0,不知道怎么错了。
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf LONG_LONG_MAX
using namespace std;
ll n,q;
ll num[maxn],w[4*maxn],lzy_set[4*maxn],lzy_add[4*maxn];
void pushup(ll u){
w[u]=max(w[u*2],w[u*2+1]);
}
void build(ll u,ll l,ll r){ //建树
lzy_set[u]=inf;
if(l==r){
w[u]=num[l];
return;
}
ll mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void maketag(ll u,ll k,ll type){ //标记延迟标记
if(type==1){
lzy_add[u]=0;
lzy_set[u]=k;
w[u]=k;
}
else{
if(lzy_set[u]==inf){
lzy_add[u]+=k;
}
else{
lzy_set[u]+=k;
}
w[u]+=k;
}
}
void pushdown(ll u){
if(lzy_set[u]==inf){
maketag(u*2,lzy_add[u],2);
maketag(u*2+1,lzy_add[u],2);
lzy_add[u]=0;
}
else{
maketag(u*2,lzy_set[u],1);
maketag(u*2+1,lzy_set[u],1);
lzy_set[u]=inf;
}
}
void update(ll u,ll l,ll r,ll ql,ll qr,ll k,ll type){
if(type==1){
if(ql<=l&&r<=qr){ //完全包含
maketag(u,k,1);
}
else if(!((l>qr)||(r<ql))){ //不完全包含
ll mid=(l+r)/2;
pushdown(u);
update(u*2,l,mid,ql,qr,k,1);
update(u*2+1,mid+1,r,ql,qr,k,1);
pushup(u);
}
}
else{
if(ql<=l&&r<=qr){ //完全包含
maketag(u,k,2);
}
else if(!((l>qr)||(r<ql))){ //不完全包含
ll mid=(l+r)/2;
pushdown(u);
update(u*2,l,mid,ql,qr,k,2);
update(u*2+1,mid+1,r,ql,qr,k,2);
pushup(u);
}
}
}
ll query(ll u,ll l,ll r,ll ql,ll qr){
if(ql<=l&&r<=qr){
return w[u];
}
else if((l>qr)||(r<ql)){ //无交接
return 0;
}
else{
ll mid=(l+r)/2;
pushdown(u);
ll sum=max(query(u*2,l,mid,ql,qr),query(u*2+1,mid+1,r,ql,qr));
return sum;
}
}
int main(){
//cout<<inf<<"\n";
scanf("%lld%lld",&n,&q);
for(ll i=1;i<=n;i++){
scanf("%lld",&num[i]);
}
build(1,1,n);
for(ll i=1;i<=q;i++){
ll op,x,y;
ll k;
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld%lld",&x,&y,&k);
update(1,1,n,x,y,k,1);
}
else if(op==2){
scanf("%lld%lld%lld",&x,&y,&k);
update(1,1,n,x,y,k,2);
}
else{
scanf("%lld%lld",&x,&y);
ll sum=query(1,1,n,x,y);
printf("%lld\n",sum);
}
}
return 0;
}
测评
by imfbust @ 2024-08-16 21:01:45
@zhyn ,在你那个query函数中若无交接需返回-inf,不然返回0就都比其他数大了
by zhyn @ 2024-08-16 21:43:52
@imfbust ,谢谢,原来是这里错了。还是太弱了。。已AC。已关。