#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版权协议,转载请附上原文出处链接和本声明。