动态开点线段树求查错(区间加维护最大值)(不含多余代码)
  • 板块学术版
  • 楼主Starlight237
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/8/2 09:13
  • 上次更新2023/11/6 21:32:28
查看原帖
动态开点线段树求查错(区间加维护最大值)(不含多余代码)
75765
Starlight237楼主2020/8/2 09:13
struct Node{
    int val, tag; Node *ls, *rs;
    Node() {}
    Node(int val, int tag, Node *ls, Node *rs) : val(val), tag(tag), ls(ls), rs(rs) {}
}*null, *pl[N << 2], tr[N << 2], **ptr = pl, *root;
#define newNode(a, b, c, d) (&(**ptr++ = Node(a, b, c, d)))
inline void init() {for (reg int i = 0; i < N << 2; ++i) pl[i] = &tr[i]; null = newNode(0, 0, 0, 0); root = null;}
inline void pushup(Node *rt) {rt -> val = max(rt -> ls -> val, rt -> rs -> val);}
inline void pushdown(Node *rt) {
	rt -> tag && (
		rt -> ls != null && (rt -> ls -> tag += rt -> tag, rt -> ls -> val += rt -> tag),
		rt -> rs != null && (rt -> rs -> tag += rt -> tag, rt -> rs -> val += rt -> tag),
		rt -> tag = 0
	);
}
void modify(Node *&rt, int l, int r, int ll, int rr, int v) {
	if(rt == null) rt = newNode(0, 0, null, null);
	if(ll <= l && r <= rr) {
		rt -> val += v, rt -> tag += v;
		return;
	}pushdown(rt);
	int mid = l + r >> 1;
	ll <= mid && (modify(rt -> ls, l, mid, ll, rr, v), 0),
	mid < rr && ( modify(rt -> rs, mid + 1, r, ll, rr, v), 0);
	pushup(rt);
}

RT。

2020/8/2 09:13
加载中...