社区讨论

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 条回复,欢迎继续交流。

正在加载回复...