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;
}
这是错误写法。
求神犇解答。