9 pts 或许需要
  • 板块P4513 小白逛公园
  • 楼主aish
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/23 14:31
  • 上次更新2023/11/23 18:29:27
查看原帖
9 pts 或许需要
939357
aish楼主2023/11/23 14:31

问题可能有 3:

  • 初始化的时候 left-most, right-most, answer 设为了 max(0, v)(当然,这样应该过不了样例
  • 合并时候出了问题。
  • 在查询合并的时候与空节点合并了。

例如这是正确的:

Node query(int L, int R, int p = 1, int l = 1, int r = n) {
	if (L <= l && r <= R) return val[p];
	int mid = (l + r) >> 1;
	if (R <= mid) return query(L, R, lc(p), l, mid);
	if (L > mid) return query(L, R, rc(p), mid + 1, r);
	return query(L, R, lc(p), l, mid) + query(L, R, rc(p), mid + 1, r);
}

但是这是错误的:

Node query(int L, int R, int p = 1, int l = 1, int r = n) {
	if (L <= l && r <= R) return val[p];
	int mid = (l + r) >> 1;
	Node res = {0, 0, 0, -inf};
	if (L <= mid) res = query(L, R, lc(p), l, mid);
	if (R > mid) res = res + query(L, R, rc(p), mid + 1, r);
	return res;
}

附注:

struct Node {
	int sum, lmo, rmo, res;
	Node operator + (const Node &n) const {
		return {
			sum + n.sum,
			max(lmo, sum + n.lmo),
			max(n.rmo, n.sum + rmo),
			max(max(res, n.res), rmo + n.lmo)
		};
	}

	void init(int v) {
		sum = res = lmo = rmo = v;
	}
} val[N << 2];
2023/11/23 14:31
加载中...