虽然 A 了,但不懂为啥错了
查看原帖
虽然 A 了,但不懂为啥错了
712506
Lucky_Cloud楼主2024/6/20 09:59
struct tree {
        int l, r;
        int max;
        int lmax, rmax;
        int min;
        int lmin, rmin;
        int sum;

        void init(int x) {
            lmin = rmin = lmax = rmax =max = min = sum = x;
            max = std::max(0, max);
            min = std::min(0, min);
        }
    } ;
    void pushup(tree &a, tree b, tree c) {
        a.sum = b.sum + c.sum;
        a.lmax = max(b.lmax, b.sum + c.lmax);
        a.rmax = max(c.rmax, b.rmax + c.sum);
        a.lmin = min(b.lmin, b.sum + c.lmin);
        a.rmin = min(c.rmin, b.rmin + c.sum);
        a.max = max({b.max, c.max, b.rmax + c.lmax, 0});
        a.min = min({b.min, c.min, b.rmin + c.lmin, 0});
    }

    tree que(int L, int R, int p) {
        int l = t[p].l, r = t[p].r;
        if (L <= l && r <= R) return t[p];
        tree res; res.init(0);
        int mid = l + r >> 1;
        // cout << p << '\n';
        tree res1, res2;
        if (L <= mid) res1 = que(L, R, ls);
        if (R > mid) res2 = que(L, R, rs);
        if (R <= mid) return res1;
        if (L > mid) return res2;
        pushup(res, res1, res2);
        return res;
    }

这一份是正确的写法。

struct tree {
        int l, r;
        int max;
        int lmax, rmax;
        int min;
        int lmin, rmin;
        int sum;

        void init(int x) {
            lmin = rmin = lmax = rmax =max = min = sum = x;
            max = std::max(0, max);
            min = std::min(0, min);
        }
    } ;
    void pushup(tree &a, tree b, tree c) {
        a.sum = b.sum + c.sum;
        a.lmax = max(b.lmax, b.sum + c.lmax);
        a.rmax = max(c.rmax, b.rmax + c.sum);
        a.lmin = min(b.lmin, b.sum + c.lmin);
        a.rmin = min(c.rmin, b.rmin + c.sum);
        a.max = max({b.max, c.max, b.rmax + c.lmax, 0});
        a.min = min({b.min, c.min, b.rmin + c.lmin, 0});
    }

    tree que(int L, int R, int p) {
        int l = t[p].l, r = t[p].r;
        if (L <= l && r <= R) return t[p];
        tree res; res.init(0);
        int mid = l + r >> 1;
        // cout << p << '\n';
        if (L <= mid) pushup(res, que(L, R, ls), res);
        if (R > mid) pushup(res, res, que(L, R, rs));
        return res;
    }

这是错误写法。

求神犇解答。

2024/6/20 09:59
加载中...