20pts 求调
查看原帖
20pts 求调
700558
williamwei楼主2024/8/6 14:02
#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
const int inf = -2147483648;
int n, m, d[maxn], c[maxn << 2], C[maxn << 2], a[maxn << 2], A[maxn << 2], b[maxn << 2], B[maxn << 2];
void g(int k, int v1, int v2) {
    c[k] = v1; C[k] = max(C[k], v2);
	a[k] = v1; A[k] = max(A[k], v2);
}
void f(int k, int v1, int v2) {
    if (a[k] != inf) {g(k, a[k] + v1, A[k] + v2); return;}
    B[k] = max(B[k], b[k] + v2); b[k] += v1; c[k] += v1;
	C[k] = max(C[k], c[k] - b[k] + B[k]);
}
void pushup(int k) {
    c[k] = max(c[lson], c[rson]);
    C[k] = max(C[lson], C[rson]);
}
void pushdown(int k) {
    f(lson, b[k], B[k]); f(rson, b[k], B[k]);
    if (a[k] != inf) g(lson, a[k], A[k]), g(rson, a[k], A[k]), a[k] = inf;
}
void build(int k, int l, int r) {
    a[k] = A[k] = inf;
    if (l == r) {c[k] = C[k] = d[l]; return;}
    int mid = (l + r) >> 1;
    build(lson, l, mid);
    build(rson, mid + 1, r);
    pushup(k);
}
void add(int k, int l, int r, int L, int R, int v) {
    if (L <= l && r <= R) {c[k] += v; C[k] = max(C[k], c[k] + v); b[k] += v; B[k] = max(B[k], b[k] + v); return;}
    int mid = (l + r) >> 1; pushdown(k);
    if (L <= mid) add(lson, l, mid, L, R, v);
    if (R > mid) add(rson, mid + 1, r, L, R, v);
    pushup(k);
}
void update(int k, int l, int r, int L, int R, int v) {
    if (L <= l && r <= R) {c[k] = v; C[k] = max(C[k], v); a[k] = v; A[k] = max(A[k], v); return;}
    int mid = (l + r) >> 1, res = -inf; pushdown(k);
    if (L <= mid) update(lson, l, mid, L, R, v);
    if (R > mid) update(rson, mid + 1, r, L, R, v);
    pushup(k);
}
int getmax(int k, int l, int r, int L, int R) {
    if (L <= l && r <= R) return c[k];
    int mid = (l + r) >> 1, res = inf; pushdown(k);
    if (L <= mid) res = max(res, getmax(lson, l, mid, L, R));
    if (R > mid) res = max(res, getmax(rson, mid + 1, r, L, R));
    return res;
}
int query(int k, int l, int r, int L, int R) {
    if (L <= l && r <= R) return C[k];
    int mid = (l + r) >> 1, res = inf; pushdown(k);
    if (L <= mid) res = max(res, query(lson, l, mid, L, R));
    if (R > mid) res = max(res, query(rson, mid + 1, r, L, R));
    return res;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> d[i];
    build(1, 1, n); cin >> m;
    while (m--) {
        char op; int l, r, x; cin >> op >> l >> r;
        if (op == 'Q') cout << getmax(1, 1, n, l, r) << '\n';
        else if (op == 'A') cout << query(1, 1, n, l, r) << '\n';
        else if (op == 'P') cin >> x, add(1, 1, n, l, r, x);
        else cin >> x, update(1, 1, n, l, r, x);
    }
    return 0;
}

已过样例。提交记录:https://www.luogu.com.cn/record/170908882

2024/8/6 14:02
加载中...