社区讨论
求大神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 条回复,欢迎继续交流。
正在加载回复...