线段树板子

#include<bits/stdc++.h>
#define lc o << 1
#define rc o << 1 | 1
const int N=1e5+10;
const int inf = 2e9;
int a[N];
struct SegTree {
  int sum[N * 4], maxx[N* 4];
  void build(int o, int l, int r) {
    if (l == r) {
      sum[o] = maxx[o] = a[l];
      return;
    }
    int mid = (l + r) >> 1;
    build(lc, l, mid);
    build(rc, mid + 1, r);
    sum[o] = sum[lc] + sum[rc];
    maxx[o] = std::max(maxx[lc], maxx[rc]);
  }
  int query1(int o, int l, int r, int ql, int qr) {  // max
    if (l > qr || r < ql) return -inf;
    if (ql <= l && r <= qr) return maxx[o];
    int mid = (l + r) >> 1;
    return std::max(query1(lc, l, mid, ql, qr), query1(rc, mid + 1, r, ql, qr));
  }
  int query2(int o, int l, int r, int ql, int qr) {  // sum
    if (l > qr || r < ql) return 0;
    if (ql <= l && r <= qr) return sum[o];
    int mid = (l + r) >> 1;
    return query2(lc, l, mid, ql, qr) + query2(rc, mid + 1, r, ql, qr);
  }
  void update(int o, int l, int r, int x, int t) {
    if (l == r) {
      maxx[o] = sum[o] = t;
      return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid)
      update(lc, l, mid, x, t);
    else
      update(rc, mid + 1, r, x, t);
    sum[o] = sum[lc] + sum[rc];
    maxx[o] = std::max(maxx[lc], maxx[rc]);
  }
} st;

带lazy

#include<bits/stdc++.h>
#define N 500010
#define ls x << 1
#define rs x << 1 | 1
using namespace std;
int sum[N], lazy[N], n, q, i, sz[N], a[N];
int gi() {
        int x = 0; char c = getchar();
        while (c < '0' || c > '9') c = getchar();
        while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x;
}
void down(int x) {
        sum[ls] += lazy[x] * sz[ls];
        sum[rs] += lazy[x] * sz[rs];
        lazy[ls] += lazy[x], lazy[rs] += lazy[x], lazy[x] = 0;
} 
void build(int x, int l, int r) {
        sz[x] = (r - l + 1);
        if (l == r) {sum[x] = a[l]; return;}
        int mid = (l + r) >> 1;
        build(ls, l, mid), build(rs, mid + 1, r);
        sum[x] = sum[ls] + sum[rs];
} 
void updata(int x, int l, int r, int xl, int xr, int v) {
        down(x);
        if (xl == l && xr == r) {
                sum[x] += v * sz[x], lazy[x] += v;
                return;
        }
        int mid =(l + r) >> 1;
        if (xr <= mid) updata(ls, l, mid, xl, xr, v);
        else if (xl > mid) updata(rs, mid + 1, r, xl, xr, v);
        else updata(ls, l, mid, xl, mid, v), updata(rs, mid + 1, r, mid + 1, xr, v);
        sum[x] = sum[ls] + sum[rs];
}

int query(int x, int l, int r, int xl, int xr) {
        down(x);
        if (xl <= l && r <= xr) return sum[x];
        int mid = (l + r) >> 1;
        if (xr <= mid) return query(ls, l, mid, xl, xr);
        else if (xl > mid) return query(rs, mid + 1, r, xl, xr);
        else return query(ls, l, mid, xl, mid) + query(rs, mid + 1, r, mid + 1, xr);
}
int main() {
        n = gi(); 
        for (i = 1; i <= n; i++) a[i] = gi();
        q = gi();
        build(1, 1, n);
        for (i = 1; i <= q; i++) {
                int v, l, r, type;                                              //type=1:add type!=1:find sum 
                scanf("%d", &type);
                if (type == 1) scanf("%d%d%d", &l, &r, &v), updata(1, 1, n, l, r, v);
                else scanf("%d%d", &l,&r), printf("%d\n", query(1, 1, n, l, r));
        }
}

将区间改为一个值

```cpp

#include<bits/stdc++.h>
#define N 500010
#define ls x << 1
#define rs x << 1 | 1
using namespace std;
int sum[N], lazy[N], n, q, i, sz[N], a[N];
int gi() {
        int x = 0; char c = getchar();
        while (c < '0' || c > '9') c = getchar();
        while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x;
}
void down(int x) {
        if(lazy[x]){
            sum[ls] = lazy[x] * sz[ls];
            sum[rs] = lazy[x] * sz[rs];
            lazy[ls] = lazy[x], lazy[rs] = lazy[x], lazy[x] = 0;
        }
} 
void build(int x, int l, int r) {
        sz[x] = (r - l + 1);
        if (l == r) {sum[x] = a[l]; return;}
        int mid = (l + r) >> 1;
        build(ls, l, mid), build(rs, mid + 1, r);
        sum[x] = sum[ls] + sum[rs];
} 
void updata(int x, int l, int r, int xl, int xr, int v) {
        down(x);
        if (xl == l && xr == r) {
                sum[x] = v * sz[x], lazy[x] = v;
                return;
        }
        int mid =(l + r) >> 1;
        if (xr <= mid) updata(ls, l, mid, xl, xr, v);
        else if (xl > mid) updata(rs, mid + 1, r, xl, xr, v);
        else updata(ls, l, mid, xl, mid, v), updata(rs, mid + 1, r, mid + 1, xr, v);
        sum[x] = sum[ls] + sum[rs];
}

int query(int x, int l, int r, int xl, int xr) {
        down(x);
        if (xl <= l && r <= xr) return sum[x];
        int mid = (l + r) >> 1;
        if (xr <= mid) return query(ls, l, mid, xl, xr);
        else if (xl > mid) return query(rs, mid + 1, r, xl, xr);
        else return query(ls, l, mid, xl, mid) + query(rs, mid + 1, r, mid + 1, xr);
}
int main() {
        n = gi(); 
        for (i = 1; i <= n; i++) a[i] = gi();
        q = gi();
        build(1, 1, n);
        for (i = 1; i <= q; i++) {
                int v, l, r, type;                                              //type=1:add type!=1:find sum 
                scanf("%d", &type);
                if (type == 1) scanf("%d%d%d", &l, &r, &v), updata(1, 1, n, l, r, v);
                else scanf("%d%d", &l,&r), printf("%d\n", query(1, 1, n, l, r));
        }
}



版权声明:本文为weixin_45714303原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。