前几日参加了西山居比赛,里面有一道线段树题,代码量奇大,不过就是稍微变了点花样的标准线段树Lv3题,就是插入删除一些线段,然后问你其中最左边的长度至少为x的线段在哪儿。这道题前天调了2个小时终于AC,使我想起了Lv3中我一直挂到现在的题:也是不断插入、删除线段,然后问你所有连续的空余线段中最长的一个长多少,两道题几乎一样。
西山居题调了两小时,最后发现是标记下传写错了…… 标记下传需要应用的场合很多,应该说,只要你访问的是这个区间的“一部分”,就应当先标记下传再干别的事。而且标记下传的时候,要在父亲这儿把儿子的信息修改好,然后告诉儿子自己的标记。如果少标记下传的话是肯定要出错的。
另外,标记下传通常行数比较多…… 而且经常在不同的模块里用,所以最好写成函数。我一般用downpass来命名这个函数。
我原来一直以为poj的1823是不需要记录颜色的,后来发现还真需要,不然标记下传的时候没法传……这就作为一个经验吧。
修改了标记下传的函数以后,1823瞬间AC……Lv3似乎只剩下一道计数的题了。
另外这种标记下传出错特别恶心,如果没有20几个操作,根本就看不出错误,所以测试这种题的时候,一定要设计一个规模大一点的数据,然后在纸上模拟一下,这样才会查出错误。当时然有了上面的经验,出错的概率应该已经减少了吧。