社区讨论
50pts,求调
P1253扶苏的问题参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miliipqw
- 此快照首次捕获于
- 2025/11/30 17:23 3 个月前
- 此快照最后确认于
- 2025/12/03 12:35 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1000005;
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
ll a[MAXN];
struct Node{
ll tag1,tag2,ans;
bool use;
}t[MAXN<<2];
int n,q;
void push_up(int p){
t[p].ans=max(t[ls(p)].ans,t[rs(p)].ans);
}
void push_down(int p){
ll k1=t[p].tag1,k2=t[p].tag2;
if(t[p].use){
t[ls(p)].tag1=k1;
t[ls(p)].tag2=k2;
t[ls(p)].ans=k1+k2;
t[ls(p)].use=1;
t[rs(p)].tag1=k1;
t[rs(p)].tag2=k2;
t[rs(p)].ans=k1+k2;
t[rs(p)].use=1;
}else{
t[ls(p)].tag2+=k2;
t[ls(p)].ans+=k2;
t[rs(p)].tag2+=k2;
t[rs(p)].ans+=k2;
}
t[p].tag1=0;
t[p].tag2=0;
t[p].use=0;
}
void build(int p,int l,int r){
t[p].tag1=0;
t[p].tag2=0;
t[p].ans=LONG_LONG_MIN;
t[p].use=0;
if(l==r){
t[p].ans=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void update1(int p,int l,int r,int nl,int nr,ll k1){
if(nl<=l&&r<=nr){
t[p].tag1=k1;
t[p].tag2=0;
t[p].ans=k1;
t[p].use=1;
return;
}
push_down(p);
int mid=(l+r)>>1;
if(nl<=mid) update1(ls(p),l,mid,nl,nr,k1);
if(nr>mid) update1(rs(p),mid+1,r,nl,nr,k1);
push_up(p);
}
void update2(int p,int l,int r,int nl,int nr,ll k2){
if(nl<=l&&r<=nr){
t[p].tag2+=k2;
t[p].ans+=k2;
return;
}
push_down(p);
int mid=(l+r)>>1;
if(nl<=mid) update2(ls(p),l,mid,nl,nr,k2);
if(nr>mid) update2(rs(p),mid+1,r,nl,nr,k2);
push_up(p);
}
ll query(int p,int l,int r,int nl,int nr){
if(nl<=l&&r<=nr){
return t[p].ans;
}
push_down(p);
ll res=LONG_LONG_MIN;
int mid=(l+r)>>1;
if(nl<=mid) res=max(res,query(ls(p),l,mid,nl,nr));
if(nr>mid) res=max(res,query(rs(p),mid+1,r,nl,nr));
return res;
}
int main(){
int op,l,r;
ll x;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for(int i=1;i<=q;i++){
scanf("%d%d%d",&op,&l,&r);
if(op==1||op==2){
scanf("%lld",&x);
}
if(op==1) update1(1,1,n,l,r,x);
else if(op==2) update2(1,1,n,l,r,x);
else if(op==3) printf("%lld\n",query(1,1,n,l,r));
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...