社区讨论

求调

P1253扶苏的问题参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj1qkdv
此快照首次捕获于
2025/11/03 19:18
4 个月前
此快照最后确认于
2025/11/03 19:18
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ls u<<1
#define rs u<<1|1
#define N 1000010
#define inf 100000000000000000011
#define ll long long 
ll a[N],w[N*4],lzya[N*4],lzys[N*4],n,q;
void pushup(ll u){
	w[u]=max(w[ls],w[rs]);
}
void build(ll u,ll l,ll r){
	if(l==r){
		w[u]=a[l];
		return ;
	}
	ll mid=(l+r)>>1;
	lzys[u]=inf;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(u);
}
bool inrange(ll L,ll R,ll l,ll r){
	return (l<=L)&&(R<=r);
}
bool outofrange(ll L,ll R,ll l,ll r){
	return (L>r)||(R<l);
}
void maketag(ll u,ll x,ll type){
	if(type==1){
		lzya[u]=0;
		lzys[u]=x;
		w[u]=x;
	}
	else{
		if(lzys[u]==inf) lzya[u]+=x;
		else lzys[u]+=x;
		w[u]+=x;
	}
}
void pushdown(ll u){
	if(lzys[u]==inf){
		maketag(ls,lzya[u],2);
		maketag(rs,lzya[u],2);
		lzya[u]=0;
	}
	else {
		maketag(ls,lzys[u],1);
		maketag(rs,lzys[u],1);
		lzys[u]=inf;
	}
}
void update(ll u,ll L,ll R,ll l,ll r,ll x,ll type){
	if(inrange(L,R,l,r)){
		maketag(u,x,type);
	}
	else if(!outofrange(L,R,l,r)){
		ll mid=(L+R)>>1;
		pushdown(u);
		update(ls,L,mid,l,r,x,type);
		update(rs,mid+1,R,l,r,x,type);
		pushup(u);
	}
}
ll query(ll u,ll L,ll R,ll l,ll r){
	if(inrange(L,R,l,r)) return w[u];
	else if(!outofrange(L,R,l,r)){
		ll mid=(L+R)>>1;
		pushdown(u);
		return max(query(ls,L,mid,l,r),query(rs,mid+1,R,l,r));
	}
	else return 0;
}
int main(){
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(q--){
		int op;
		scanf("%d",&op);
		if(op==1){
			ll l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			update(1,1,n,l,r,x,1);
		}
		else if(op==2){
			ll l,r,x;
			scanf("%lld%lld%lld",&l,&r,&x);
			update(1,1,n,l,r,x,2);
		}
		else {
			ll l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(1,1,n,l,r));
		}
	}
	return 0;
}

50分求调

回复

1 条回复,欢迎继续交流。

正在加载回复...