社区讨论

求大神oi帮忙,50分

P1253扶苏的问题参与者 3已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mi7j8see
此快照首次捕获于
2025/11/20 22:34
4 个月前
此快照最后确认于
2025/11/21 11:51
4 个月前
查看原帖
为啥怎么都只有50分,求大神oi帮忙查看
CPP
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1000005;
ll arr[N];
ll Max[N << 2];//累加和是数组(N << 2相当于N * 2) 
ll add[N << 2];//增添懒更新 
ll change[N << 2];//重置懒更新 
bool update[N << 2];

//处理懒信息 l ~ r 重置为v 
void updatelazy(int i, ll v) {
	Max[i] = v;
	add[i] = 0;
	change[i] = v;
	update[i] = true;
}

void addlazy(int i, ll v) {
	Max[i] += v;
	add[i] += v;
}

//累加信息的汇总
void up(int i) {
	Max[i] = max(Max[i << 1], Max[i << 1 | 1]);
} 

//建立线段树
void build(int l, int r, int i) {
	if (l == r) {
		Max[i] = arr[l];
	}
	else {
		int mid = l + r >> 1;
		build(l, mid, i << 1);
		build(mid + 1, r, i << 1 | 1);
		up(i);
	}
	change[i] = 0;
	update[i] = false;
} 

//懒信息下发
//l ~ r i 懒
//l ~ mid  i * 2 几个数ln
//mid + 1 ~ r  i * 2 + 1 
void down(int i) {
	if (update[i]) {
		updatelazy(i << 1, change[i]); 
		updatelazy(i << 1 | 1, change[i]);
		update[i] = false;
		change[i] = 0;//可写可不写 
	}
	if (add[i] != 0) {
		addlazy(i << 1, add[i]);
		addlazy(i << 1 | 1, add[i]);
		add[i] = 0;
	}
}

void updates(int jobl, int jobr, ll jobv, int l, int r, int i) {
	if (jobl <= l && r <= jobr) {
		updatelazy(i, jobv);
	}
	else {
		int mid = l + r >> 1;
		down(i);
		if (jobl <= mid) {
			updates(jobl, jobr, jobv, l, mid, i << 1);
		}
		if (jobr > mid) {
			updates(jobl, jobr, jobv, mid + 1, r, i << 1 | 1);
		}
		up(i);
	} 
} 

void adds(int jobl, int jobr, ll jobv, int l, int r, int i) {
	if (jobl <= l && r <= jobr) {
		addlazy(i, jobv);
	} 
	else {
		int mid = (l + r) >> 1;
		down(i);
		if (jobl <= mid) {
			adds(jobl, jobr, jobv, l, mid, i << 1);
		}
		if (jobr > mid) {
			adds(jobl, jobr, jobv, mid + 1, r, i << 1 | 1);
		}
		up(i);
	}
}


//查询累加和 
ll query(int jobl, int jobr, int l, int r, int i) {
	if (jobl <= l && r <= jobr) return Max[i];
	int mid = l + r >> 1;
	down(i);
	ll ans = -0x3f3f3f3f;
	if (jobl <= mid) {
		ans = max(ans, query(jobl, jobr, l, mid, i << 1));
	} 
	if (jobr > mid) {
		ans = max(ans, query(jobl, jobr, mid + 1, r, i << 1 | 1));
	}
	return ans;
}

int n, q;

int main() {
	ios::sync_with_stdio(0);
	std::cin.tie(0);
	std::cout.tie(0);
	cin >> n >> q;
	for (int i = 1; i <= n; i++) cin >> arr[i];
	build(1, n, 1);
	while (q--) {
		int op;
		cin >> op;
		if (op == 1) {
			ll l, r, v;
			cin >> l >> r >> v;
			updates(l, r, v, 1, n, 1);
		}
		else if (op == 2) {
			ll l, r, v;
			cin >> l >> r >> v;
			adds(l, r, v, 1, n, 1);
		}
		else {
			ll l, r;
			cin >> l >> r;
			ll ans = query(l, r, 1, n , 1);
			cout << ans << endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...