线段树 30pts 求调
查看原帖
线段树 30pts 求调
620018
_IceCream_楼主2024/8/28 17:28
#include <bits/stdc++.h>
using namespace std;

const int N = 5e5 + 5;
int n, m;
long long a[N];

struct Seg {
    long long mi, sum;
    long long laz;

    Seg () {sum = laz = 0LL; mi = LONG_LONG_MAX;}
} tree[N << 2];

void pushup (int node) {
    int ls = node << 1, rs = (node << 1) + 1;
    tree[node].mi = min (tree[ls].mi, tree[rs].mi);
    tree[node].sum = tree[ls].sum + tree[rs].sum;
}

void pushdown (int node, int l, int r) {
    int ls = node << 1, rs = (node << 1) + 1, mid = l + ((r - l) >> 1);
    if (tree[node].laz) {
        int x = tree[node].laz;
        tree[ls].mi += x; tree[rs].mi += x;
        tree[ls].sum += (mid - l + 1) * x; tree[rs].sum += (r - mid) * x;
        tree[ls].laz += x; tree[rs].laz += x;
        tree[node].laz = 0;
    }
}

void build (int node, int l, int r) {
    if (l == r) {
        tree[node].sum = tree[node].mi = a[l];
        return ;
    }

    int mid = l + ((r - l) >> 1);
    build (node << 1, l, mid);
    build ((node << 1) + 1, mid + 1, r);
    pushup (node);
}

void modify (int node, int l, int r, int s, int t, long long c) {
    if (s <= l && r <= t) {
        tree[node].sum += (r - l + 1) * c;
        tree[node].mi += c;
        tree[node].laz += c;
        return ;
    }

    pushdown (node, l, r);
    int mid = l + ((r - l) >> 1);
    if (s <= mid) modify (node << 1, l, mid, s, t, c);
    if (t > mid) modify ((node << 1) + 1, mid + 1, r, s, t, c);
    pushup (node);
}

long long querys (int node, int l, int r, int s, int t) {
    if (s <= l && r <= t) return tree[node].sum;

    pushdown (node, l, r);
    int mid = l + ((r - l) >> 1);
    long long ret = 0;
    if (s <= mid) ret += querys (node << 1, l, mid, s, t);
    if (t > mid) ret += querys ((node << 1) + 1, mid + 1, r, s, t);
    return ret;
}

long long querym (int node, int l, int r, int s, int t) {
    if (s <= l && r <= t) return tree[node].mi;

    pushdown (node, l, r);
    int mid = l + ((r - l) >> 1);
    long long ret = LONG_LONG_MAX;
    if (s <= mid) ret = min (ret, querym (node << 1, l, mid, s, t));
    if (t > mid) ret = min (ret, querym ((node << 1) + 1, mid + 1, r, s, t));
    return ret;
}

int main () {

    ios::sync_with_stdio (false);
    cin.tie (0); cout.tie (0);

    cin >> n >> m;
    for (int i = 1; i <= n; ++i) cin >> a[i];

    build (1, 1, n);

    while (m--) {
        char opt;
        int x, y;
        cin >> opt >> x >> y;

        if (opt == 'P') {
            long long v;
            cin >> v;
            modify (1, 1, n, x, y, v);
        } else if (opt == 'M') cout << querym (1, 1, n, x, y) << '\n';
        else cout << querys (1, 1, n, x, y) << '\n';
    }

    return 0;
}

rt, 开了 long long 并且空间开大了,依然只有 #1#3#4 AC,其他点 WA。

2024/8/28 17:28
加载中...