关于扫描线的一点疑问,悬赏关注
查看原帖
关于扫描线的一点疑问,悬赏关注
328170
Kalium楼主2023/8/9 12:56

参考第三篇题解

但是对于update中有一步不能理解

void update(int dep, ll x, ll y, int val) {
		if (x >= X[tree[dep].r + 1] || y <= X[tree[dep].l]) return ;
		
		//cout << x << " " << y << " " << tree[dep].l << " " << tree[dep].r << endl;
		
		if (x <= X[tree[dep].l] && y >= X[tree[dep].r + 1]) {
			tree[dep].sum += val;
			push_up(dep);
			return ;
		}
		
		ll mid = (X[tree[dep].l] + X[tree[dep].r + 1]) >> 1;
		
		update(dep << 1, x, y, val);
		update(dep << 1 | 1, x, y, val);
		
		push_up(dep);
	}
void update(int dep, ll x, ll y, int val) {
		if (! tree[dep].l && ! tree[dep].r) return ;
		
		//cout << x << " " << y << " " << tree[dep].l << " " << tree[dep].r << endl;
		
		if (x <= X[tree[dep].l] && y >= X[tree[dep].r + 1]) {
			tree[dep].sum += val;
			push_up(dep);
			return ;
		}
		
		ll mid = (X[tree[dep].l] + X[tree[dep].r + 1]) >> 1;
		
		if (x <= mid) update(dep << 1, x, y, val);
		if (y > mid) update(dep << 1 | 1, x, y, val);
		
		push_up(dep);
	}

以上两种写法有什么不同吗,为什么第一种写法全对,第二种写完0分。

求教

2023/8/9 12:56
加载中...