蒟蒻求救!

P3372 【模板】线段树 1

[$\small\color{pink}\text{强行安利}$](https://www.luogu.org/blog/AuAqwqnoLGBlog/solution-p3372 "蟹蟹大佬的支持qwq蒟蒻AuAqwq十分感谢qwq")
by Null_Cat @ 2019-08-03 00:58:29


@[LJY_ljy](/space/show?uid=84987)
by Null_Cat @ 2019-08-03 00:59:17


``` #include <iostream> #include <cstdio> using namespace std; const int maxn = 100010; const long long inf = 10000000; long long a[maxn]; long long minv[4 * maxn], lazy[4 * maxn]; void pushup(int id) { minv[id] = minv[id << 1]+minv[id << 1 | 1]; } void pushdown(int id,int l,int r) { if (lazy[id]) { lazy[id << 1] += lazy[id]; lazy[id << 1 | 1] += lazy[id]; int mid=(l+r)>>1; minv[id << 1] += lazy[id]*(mid-l+1); minv[id << 1 | 1] += lazy[id]*(r-mid); lazy[id] = 0; } } void build(int id, int l, int r) { if (l == r) { minv[id] = a[l]; return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); pushup(id); } void update(int id, int l, int r, long long x, long long y, long long v) { if (x <= l && r <= y) { lazy[id] += v; minv[id] += v*(r-l+1); return; } pushdown(id,l,r); int mid = (l + r) >> 1; if (x <= mid) update(id << 1, l, mid, x, y, v); if (y > mid) update(id << 1 | 1, mid + 1, r, x, y, v); pushup(id); } long long query(int id, int l, int r, long long x, long long y) { long long res = 0; if (x <= l && r <= y) { return minv[id]; } pushdown(id,l,r); int mid = (l + r) >> 1; if (x <= mid) res += query(id << 1, l, mid, x, y); if (y > mid) res += query(id << 1 | 1, mid + 1, r, x, y); return res; } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, 1, n); for (int i = 1; i <= m; i++) { int op; scanf("%d", &op); if (op == 1) { long long x, y, v; scanf("%lld %lld %lld", &x, &y, &v); update(1, 1, n, x, y, v); } else { long long x, y; scanf("%lld %lld", &x, &y); printf("%lld\n", query(1, 1, n, x, y)); } } return 0; } ```
by Porsche @ 2019-08-03 06:08:16


已改正 改动了pushup,注意审题,让求的是区间和,而不是区间最小值。 pushdown,下传懒标记的时候注意要乘上区间长度。 update,修改时也要注意区间长度。
by Porsche @ 2019-08-03 06:10:45


@[AuAqwq](/space/show?uid=213346) Thanks~
by LJY_ljy @ 2019-08-03 15:42:53


@[Porsche](/space/show?uid=93488) 谢谢您的改正
by LJY_ljy @ 2019-08-03 15:43:14


@[LJY_ljy](/space/show?uid=84987) 喵喵喵~
by Porsche @ 2019-08-03 15:48:03


|