结构体线段树又双叒叕求调...

P1253 扶苏的问题

@[Stevehim](/user/759274) 1. 覆盖操作后要立即将加的标记归零,不然先赋值再加会出bug 2. 显然我可以赋值成-1e8,inf绝对值要取到1e9以上
by MarSer020 @ 2023-01-19 21:09:48


@[_MarSser020_](/user/475112) 但是我spread里面已经即使归0了a
by Stevehim @ 2023-01-19 21:50:15


@[Stevehim](/user/759274) 全局赋值再全局加就会出问题
by MarSer020 @ 2023-01-20 12:29:13


@[_MarSser020_](/user/475112) 还是有点不理解... 照着您的意思改了一下发现还是不行,您能看一下吗...? ```cpp void spread(int p) { //下传操作 if (a[p].add2 != inf) { //检测赋值标记是否存在 // a[p].add2 += a[p].add; //加上修改标记,如果没有也没关系反正是0 a[p * 2].add2 = a[p].add2; //更新标记 a[p * 2 + 1].add2 = a[p].add2; a[p * 2].val = (a[p * 2].r - a[p * 2 ].l + 1) * (a[p].add2 + a[p].add); //更新 a[p * 2 + 1].val = (a[p * 2 + 1].r - a[p * 2 + 1].l + 1) * (a[p].add2 + a[p].add); //更新 a[p * 2].add = a[p].add; //因为相当于同时传了俩标记,这块就放成0防止额外加 a[p * 2 + 1].add = a[p].add; //参见上方 a[p].add = 0; a[p].add2 = inf; } else { //没有加赋值标记 a[p * 2].val += (a[p * 2].r - a[p * 2 ].l + 1) * a[p].add; a[p * 2 + 1].val += (a[p * 2 + 1].r - a[p * 2 + 1].l + 1) * a[p].add; //注意是添加 a[p * 2].add += a[p].add; a[p * 2 + 1].add += a[p].add; //同样注意是添加,而不是像刚刚的直接等 a[p].add = 0; a[p].add2 = inf; } } ```
by Stevehim @ 2023-01-20 14:47:32


|