社区讨论

求调,或者给个hack数据

P1253扶苏的问题参与者 4已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lo158dy1
此快照首次捕获于
2023/10/22 15:24
2 年前
此快照最后确认于
2023/11/02 14:56
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 4e6+114;
int n,q,a[N];
struct tree{int l,r,k,ans,tag1,tag2;}rt[N];
void build(int l,int r,int k){
	rt[k].tag1=1e9+1;
	rt[k].l=l,rt[k].r=r;
	if(l==r){rt[k].ans=a[l],rt[k].tag2=0;return;}
	int mid = (l + r) >> 1;
	build(l,mid,k<<1);build(mid+1,r,k<<1|1);
	rt[k].ans=max(rt[k<<1].ans,rt[k<<1|1].ans);
}
void pushdown(int k){
	if(rt[k].tag1 != 1e9+1){
		rt[k<<1].tag1 = rt[k<<1|1].tag1 = rt[k].tag1;
		rt[k<<1].ans = rt[k<<1|1].ans = rt[k].ans;
		rt[k].tag1 = 1e9+1;
		rt[k].tag2 = 0;
	}
	if(rt[k].tag2){
		rt[k<<1].tag2 += rt[k].tag2;
		rt[k<<1|1].tag2 += rt[k].tag2;
		rt[k<<1].ans += rt[k].tag2;
		rt[k<<1|1].ans += rt[k].tag2;
		rt[k].tag2 = 0;
	}
}
//8 3
void updata1(int l,int r,int k,int val){
	if(l <= rt[k].l && rt[k].r <= r){
		rt[k].tag2 = 0;
		rt[k].ans = val;
		rt[k].tag1 = val;
		return;
	}
	pushdown(k);
	if(r >= rt[k<<1|1].l)updata1(l,r,k<<1|1,val);
	if(l <= rt[k<<1].r)updata1(l,r,k<<1,val);
	rt[k].ans=max(rt[k<<1].ans,rt[k<<1|1].ans);
	
}
void updata2(int l,int r,int k,int val){
	if(l <= rt[k].l && rt[k].r <= r){
		rt[k].tag2 += val;
		rt[k].ans += val;
		return;
	}
	pushdown(k);
	if(r >= rt[k<<1|1].l)updata2(l,r,k<<1|1,val);
	if(l <= rt[k<<1].r)updata2(l,r,k<<1,val);
	rt[k].ans=max(rt[k<<1].ans,rt[k<<1|1].ans);
}
int query(int l,int r,int k){
	if(l <= rt[k].l && rt[k].r <= r)
		return rt[k].ans;
	int aans = -1e9-1;
	pushdown(k);
	if(r >= rt[k<<1|1].l)aans = max(aans,query(l,r,k<<1|1));
	if(l <= rt[k<<1].r)aans = max(aans,query(l,r,k<<1));
	rt[k].ans=max(rt[k<<1].ans,rt[k<<1|1].ans);
	return aans;
}

signed main(){
	cin >> n >> q;
	for(int i = 1;i <= n; i++)
		cin >> a[i];
	build(1,n,1);
	while(q--){
		int opt,l,r;
		cin >> opt >> l >> r;
		if(opt == 1){
			int val;
			cin >> val;
			updata1(l,r,1,val);
		}
		if(opt == 2){
			int val;
			cin >> val;
			updata2(l,r,1,val);
		}
		if(opt == 3){
			cout << query(l,r,1) << "\n";
		}
	}
	return 0;
}

回复

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

正在加载回复...