1 条题解
-
0
树状数组
线段树
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 1; int n, m, a[N]; struct Node { int l, r; ll sum, lazy; } tr[N << 2]; void pushup(Node& u, Node& l, Node& r) { u.sum = l.sum + r.sum; } void pushup(int u) { pushup(tr[u], tr[u << 1], tr[u << 1 | 1]); } void pushdown(int u) { if (tr[u].lazy) { tr[u << 1].sum += (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].lazy; tr[u << 1].lazy += tr[u].lazy; tr[u << 1 | 1].sum += (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].lazy; tr[u << 1 | 1].lazy += tr[u].lazy; tr[u].lazy = 0; } } void build(int u, int l, int r) { // printf("build: %d %d\n",l,r); tr[u].l = l, tr[u].r = r; if (l == r) { tr[u].sum = a[l]; return; } int mid = l + r >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); pushup(u); } void modify(int u, int l, int r, int x) { // printf("modify: %d %d %d %d\n",u,l,r,x); if (l <= tr[u].l && r >= tr[u].r) { tr[u].lazy += x; tr[u].sum += 1ll*(tr[u].r - tr[u].l + 1) * x; return; } pushdown(u); int mid = tr[u].l + tr[u].r >> 1; if (l <= mid) modify(u << 1, l, r, x); if (r > mid) modify(u << 1 | 1, l, r, x); pushup(u); } Node query(int u, int l, int r) { // printf("query: %d %d %d\n",u,l,r); if (l <= tr[u].l && r >= tr[u].r) return tr[u]; pushdown(u); int mid = tr[u].l + tr[u].r >> 1; // printf("query:mid = %d\n", mid); Node left = {0, 0, 0, 0}, right = {0, 0, 0, 0}; if (l <= mid) left = query(u << 1, l, r); if (r > mid) right = query(u << 1 | 1, l, r); Node res; pushup(res, left, right); return res; } int read() { int res = 0, f = 1; char c; while ((c = getchar()) < '0' || c > '9') if (c == '-') f = -1; res = c - '0'; while ((c = getchar()) >= '0' && c <= '9') res = res * 10 + c - '0'; return res * f; } int main() { n = read(), m = read(); for (int i = 1; i <= n; i++) a[i] = read(); build(1, 1, n); int op, l, r, x; while (m--) { op = read(), l = read(), r = read(); if (op == 1) { x = read(), modify(1, l, r, x); } else printf("%lld\n", query(1, l, r).sum); } return 0; }
- 1
信息
- ID
- 1679
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 34
- 已通过
- 2
- 上传者