社区讨论
玄关求条线段树,20分,码风良好
P1253扶苏的问题参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mm4as0t7
- 此快照首次捕获于
- 2026/02/27 10:53 2 周前
- 此快照最后确认于
- 2026/02/28 19:50 上周
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N=1e6+5;
const ll INF=1e18;
int n,q;
ll a[N],segtr[N<<2],tag1[N<<2],tag2[N<<2];
void push_down(int rt,int l,int r){
if(l==r)return;
if(tag1[rt]!=INF)tag2[rt<<1]=tag2[rt<<1|1]=0,segtr[rt<<1]=segtr[rt<<1|1]=tag1[rt<<1]=tag1[rt<<1|1]=tag1[rt],tag1[rt]=INF;
if(tag2[rt]!=0)segtr[rt<<1]+=tag2[rt],segtr[rt<<1|1]+=tag2[rt],tag1[rt<<1]+=tag2[rt],tag1[rt<<1|1]+=tag2[rt],tag2[rt]=0;
}
void build(int rt,int l,int r){
tag1[rt]=INF,tag2[rt]=0;
if(l==r){
segtr[rt]=a[l];
return;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
segtr[rt]=max(segtr[rt<<1],segtr[rt<<1|1]);
}
void update(int rt,int l,int r,int ql,int qr,int op,ll x){
if(ql<=l&&r<=qr){
if(op==1)tag1[rt]=segtr[rt]=x,tag2[rt]=0;
else{
if(tag1[rt]!=INF)tag1[rt]+=x;
else tag2[rt]+=x;
segtr[rt]+=x;
}
return;
}
push_down(rt,l,r);
int mid=l+r>>1;
if(ql<=mid)update(rt<<1,l,mid,ql,qr,op,x);
if(qr>mid)update(rt<<1|1,mid+1,r,ql,qr,op,x);
segtr[rt]=max(segtr[rt<<1],segtr[rt<<1|1]);
}
ll query(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return segtr[rt];
push_down(rt,l,r);
int mid=l+r>>1;
ll res=-INF;
if(ql<=mid)res=max(res,query(rt<<1,l,mid,ql,qr));
if(qr>mid)res=max(res,query(rt<<1|1,mid+1,r,ql,qr));
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;++i)cin>>a[i];
build(1,1,n);
while(q--){
int op,l,r;
cin>>op>>l>>r;
if(op==1){
ll x;
cin>>x;
update(1,1,n,l,r,op,x);
}else if(op==2){
ll x;
cin>>x;
update(1,1,n,l,r,op,x);
}else{
cout<<query(1,1,n,l,r)<<endl;
}
}
return 0;
}
已过样例,20分,可以关注。
回复
共 4 条回复,欢迎继续交流。
正在加载回复...