线段树常见错误
根据本人经历编写,可能会不定期更新,也欢迎在评论区投稿。
-
注意懒标记的默认值用
0 是否会有歧义(例:存在“将整个区间赋值为0 ”之类的操作时懒标记默认值可以是-1 或+\infty 之类的)。 -
注意你的线段树维护的是什么(比如维护区间
\max 的时候区间加不要习惯性地用维护区间和时的代码)。 -
有多个懒标记时注意它们之间的优先级和彼此之间的影响,并注意此时下传的写法(例:同时有区间赋值和区间加时一般让区间赋值的懒标记优先)。
-
注意在查询区间最值,且当前节点对应的区间与查询的区间无交集时的返回值(根据数据范围取
+\infty,0,-\infty 等)。 -
注意懒标记的初始值和下传之后的值(例:对于区间乘法的懒标记,这个值应为
1 )。 -
注意有多个懒标记时下传的条件(即有任何一个需要下传的懒标记时,就应该执行下传操作)。
-
注意题目的区间右端点是否可能大于左端点,此时需交换。
-
当更新时的式子又臭又长时,注意检查你有没有敲漏什么(比如
k*k
有没有敲成k
之类的)。 -
下传懒标记时记得更新子节点的懒标记(应该没人像我这样犯这么傻的错误吧 qwq)。
-
复制粘贴的时候记得改变量名。
-
注意差一错误(例:
>=
和>
)。 -
注意修改、查询前要下传懒标记。
-
注意对于修改、查询的边界条件,更新懒标记时也要一并更新维护的其他值。
-
注意题目给的区间范围从
0 开始还是从1 开始。 -
注意函数返回值的类型(比如不要
int build()
或者void query()
之类的,编译器应该查得出来)。 -
注意线段树用到的所有数组都要开
4 倍。 -
不开 long long 见祖宗。
-
记得调用
build(1,1,n);
(好像包括我在内的很多人犯过这个错误)。 -
不要在考场上像 @aizhoukai 一样忘记线段树怎么写(在省选联考 2025 Day 2 的考场上发生过的真事)
(虽然他最后考的还是比我高,orz)。
附:线段树常见错误快速检查清单。