社区讨论

前五个对,6-9错,10超时,求调

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhjs4ig5
此快照首次捕获于
2025/11/04 07:36
4 个月前
此快照最后确认于
2025/11/04 07:36
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf -1145141919810
struct node{
	ll date,lazy1,lazy2 = inf;
};
node tree[4010000];
ll date[1011110];
int n,m;
void creattree(int left,int right,int pos){
	if(left == right){
		tree[pos].date = date[left];
		return;
	}
	int mid = (left + right) / 2;
	creattree(left , mid, pos*2);
	creattree(mid+1, right, pos*2+1);
	tree[pos].date = max(tree[pos*2].date, tree[pos*2+1].date);
}
void pushdown(int pos){
	if(tree[pos].lazy1 || tree[pos].lazy2 != inf){
		if(tree[pos].lazy2 != inf){
			tree[pos*2].date = tree[pos].lazy1 + tree[pos].lazy2;
			tree[pos*2+1].date = tree[pos].lazy1 + tree[pos].lazy2;
			
			tree[pos*2].lazy1 = tree[pos].lazy1;
			tree[pos*2].lazy2 = tree[pos].lazy2;
			
			tree[pos*2+1].lazy1 = tree[pos].lazy1;
			tree[pos*2+1].lazy2 = tree[pos].lazy2;
			
			tree[pos].lazy1 = 0; 
			tree[pos].lazy2 = inf;
		}else if(tree[pos].lazy1){
			tree[pos*2+1].date += tree[pos].lazy1;
			tree[pos*2].date += tree[pos].lazy1;
			
			tree[pos*2].lazy1 +=tree[pos].lazy1;
			tree[pos*2+1].lazy1 += tree[pos].lazy1;
			
			tree[pos].lazy1 = 0;
		}
	}
}
ll findmax(int left,int right,int l,int r,int pos){
	if(left > r || right < l) return INT_MIN;
	if(left >= l && right <= r){
		return tree[pos].date;
	}
	int mid = (left + right) / 2;
	pushdown(pos);
	ll leftmax = findmax(left , mid, l , r, pos*2);
	ll rightmax = findmax(mid+1 , right , l , r ,pos*2+1);
	return max(leftmax , rightmax);
}
void updateranger1(int left, int right , int l , int r , int pos, ll lazy1){
	if(left > r || right < l) return ;
	if(left >= l && right <= r){
		tree[pos].date  += lazy1;
		tree[pos].lazy1  += lazy1;
		return;
	}
	int mid = (left + right) / 2;
	pushdown(pos);
	updateranger1(left, mid, l , r, pos*2 , lazy1);
	updateranger1(mid+1, right, l , r, pos*2+1 , lazy1);
	tree[pos].date = max(tree[pos*2].date , tree[pos*2+1].date);
}
void updateranger2(int left, int right , int l , int r , int pos, ll lazy2){
	if(left > r || right < l) return ;
	if(left >= l && right <= r){
		tree[pos].date  = lazy2;
		tree[pos].lazy1 = 0;
		tree[pos].lazy2 = lazy2;
		return;
	}
	int mid = (left + right) / 2;
	pushdown(pos);
	updateranger2(left, mid, l , r, pos*2 , lazy2);
	updateranger2(mid+1, right, l , r, pos*2+1 , lazy2);
	tree[pos].date = max(tree[pos*2].date , tree[pos*2+1].date);
}
int main(){
	cin >> n >> m;
	for(int i=1; i<=n ; i++){
		cin >> date[i];
	}
	creattree(1,n,1);
	while(m--){
		int a;
		cin >> a;
		if(a == 1){
			int b,c;
			ll d;
			cin >> b >> c >> d;
			updateranger2(1,n,b,c,1,d);
		}else if(a == 2){
			int b,c;
			ll d;
			cin >> b >> c >> d;
			updateranger1(1,n,b,c,1,d);
		}else{
			int b,c;
			cin >> b >> c ;
			cout << findmax(1,n,b,c,1) << "\n";
		}
	}
	return 0;
}

回复

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

正在加载回复...