MnZn线段树求助
查看原帖
MnZn线段树求助
398746
ReeChee楼主2022/9/7 21:40
// 1kb 火车头已省略,MID 指 ((l+r)>>1),read 快读已验证没有错误
const int N = 5e4 + 4;
struct STree {
  ll l, r, sum, dat, lm, rm;
} t[N * 4];
ll n, a[N], m, opt, x, y;
void pushup(ll k) {
  t[k].sum = t[k * 2].sum + t[k * 2 + 1].sum;
  t[k].lm = max(t[k * 2].lm, t[k * 2].sum + t[k * 2 + 1].lm);
  t[k].rm = max(t[k * 2 + 1].rm, t[k * 2 + 1].sum + t[k * 2].rm);
  t[k].dat =
      max(max(t[k * 2].dat, t[k * 2 + 1].dat), t[k * 2].rm + t[k * 2 + 1].lm);
  return;
}
void build(ll k, ll l, ll r) {
  t[k].l = l, t[k].r = r;
  if (l == r) {
    t[k].sum = t[k].dat = t[k].lm = t[k].rm = a[l];
    return;
  }
  build(k * 2, l, MID);
  build(k * 2 + 1, MID + 1, r);
  pushup(k);
}
void add(ll k, ll l, ll x) {
  if (t[k].l == t[k].r && t[k].l == l) {
    t[k].dat = t[k].sum = t[k].lm = t[k].rm = x;
    return;
  }
  ll mid = (t[k].l + t[k].r) >> 1;
  if (l > mid)
    add(k * 2 + 1, l, x);
  else
    add(k * 2, l, x);
  pushup(k);
  return;
}
STree ask(ll k, ll l, ll r) {
  if (t[k].l >= l && t[k].r <= r)
    return t[k];
  ll mid = (t[k].l + t[k].r) >> 1;
  if (l > mid)
    return ask(k * 2 + 1, l, r);
  else if (mid >= r)
    return ask(k * 2, l, r);
  STree ll, rr, ret;
  ll = ask(k * 2, l, r);
  rr = ask(k * 2 + 1, l, r);
  ret.dat = max(max(ll.dat, rr.dat), ll.rm + rr.lm);
  return ret;
}
int main() {
  n = read();
  F(i, 1, n) a[i] = read();
  build(1, 1, n);
  m = read();
  while (m--) {
    opt = read(), x = read(), y = read();
    if (opt == 0)
      add(1, x, y);
    else
      printf("%lld\n", ask(1, x, y).dat);
  }
  return 0;
}

RT,调一小时了,求指错或 hack。

2022/9/7 21:40
加载中...