警示后人 - 线段树做法中 `push_up()` 函数的常见误区

P2572 [SCOI2010] 序列操作

escapist404 @ 2023-07-02 21:19:18

  1. 注意在 push_up() 函数中,当前区间最大子段的来源应当是左儿子的区间最大子段右儿子的区间最大子段以及左儿子的后缀和右儿子的前缀,而不是左儿子的前缀,右儿子的后缀以及左儿子的后缀和右儿子的前缀。

  2. p[x] = push_up(p[ls(x)], p[rs(x)]); 而不是 p[x] = push_up(p[rs(x)], p[ls(x)];

  3. 注意覆盖标记和取反标记的优先级。先传递覆盖标记,再传递取反标记。


by 西瓜nd @ 2023-07-02 21:31:08

谢谢!


by Zimo_666 @ 2023-07-02 21:33:57

谢谢


by oiyang @ 2023-07-03 07:31:35

好的


by mztech @ 2023-07-09 15:20:45

覆盖标记和取反标记为什么要同时存在


by incra @ 2023-07-10 15:12:32

@mztech 否则你怎么支持两种操作?


by mztech @ 2023-07-10 16:06:22

@incra

要添加反标记时,若存在覆盖标记,直接将覆盖标记取反

添加覆盖标记时,去除反标记


by incra @ 2023-07-10 16:11:12

@mztech 有先后之分啊,还有操作之间的影响。


by mztech @ 2023-07-10 19:22:12

@incra

两种标记在每个结点不用同时存在


by a16_ @ 2023-07-30 10:12:19

@mztech 正确的


by HYX1124 @ 2023-08-01 14:33:44

感谢!


| 下一页