线段树的成段更新问题,这里可以精简的删去build和query函数。
#include <cstdio> #define lchild rt << 1, l, m #define rchild rt << 1 | 1, m + 1, r const int maxn = 1 << 18; int tree[maxn]; int lazy[maxn]; int n; void push_up(int rt) { tree[rt] = tree[rt<<1] + tree[rt<<1|1]; } void push_down(int rt, int len) { tree[rt<<1] = lazy[rt] * (len - (len >> 1)); lazy[rt<<1] = lazy[rt]; tree[rt<<1|1] = lazy[rt] * (len >> 1); lazy[rt<<1|1] = lazy[rt]; lazy[rt] = 0; } void update(int L, int R, int val, int rt = 1, int l = 1, int r = n) { if (L <= l && r <= R) { tree[rt] = val * (r - l + 1); lazy[rt] = val; return; } if (lazy[rt]) { push_down(rt, r - l + 1); } int m = (l + r) >> 1; if (L <= m) { update(L, R, val, lchild); } if (R > m) { update(L, R, val, rchild); } push_up(rt); } int main(int argc, char const *argv[]) { int T; scanf("%d", &T); for (int t = 0; t < T; t++) { int q; scanf("%d%d", &n, &q); update(1, n, 1); for (int i = 0; i < q; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); update(x, y, z); } printf("Case %d: The total value of the hook is %d.\n", t+1, tree[1]); } return 0; }