社区讨论
全RE,求调!
P3372【模板】线段树 1参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lytzymcx
- 此快照首次捕获于
- 2024/07/20 18:39 2 年前
- 此快照最后确认于
- 2024/07/20 19:57 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
struct SegTree {
int a[N * 4], d[N * 4], lzy[N * 4];
void pud(int l, int r, int s, int t, int p) {
int mid = s + (t - s >> 2);
if (lzy[p])
d[p * 2] += lzy[p] * (mid - s + 1),
d[p * 2 + 1] += lzy[p] * (t - mid),
lzy[p * 2] += lzy[p],
lzy[p * 2 + 1] += lzy[p],
lzy[p] = 0;
if (l <= mid) pud(l, r, s, mid, p * 2);
if (r > mid) pud(l, r, mid + 1, t, p * 2 + 1);
}
void build(int s, int t, int p) {
if (s == t) {
d[p] = a[s];
return;
} int mid = s + (t - s >> 2);
if (s <= mid) build(s, mid, p * 2);
if (t > mid) build(mid + 1, t, p * 2 + 1);
d[p] = d[p * 2] + d[p * 2 + 1];
}
int read(int l, int r, int s, int t, int p) {
if (l <= s && t <= r) return d[p];
int mid = s + (t - s >> 2), sum = 0;
pud(l, r, s, t, p);
if (l <= mid) sum += read(l, r, s, mid, p * 2);
if (r > mid) sum += read(l, r, mid + 1, t, p * 2 + 1);
return sum;
}
void add(int ad, int l, int r, int s, int t, int p) {
if (l <= s && t <= r)
d[p] += ad * (t - s + 1), lzy[p] += ad;
if (s != t) pud(l, r, s, t, p);
int mid = s + (t - s >> 2);
if (l <= mid) add(ad, l, r, s, mid, p * 2);
if (r > mid) add(ad, l, r, mid + 1, t, p * 2 + 1);
}
} st;
int n, m;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> st.a[i];
st.build(1, n, 1);
for (int i = 1, temp, x, y, k; i <= m; i++) {
cin >> temp;
if (temp == 1) {
cin >> x >> y >> k;
st.add(k, x, y, 1, n, 1);
} else if (temp == 2)
cin >> x >> y,
cout << st.read(x, y, 1, n, 1) << endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...