机房用小肠写代码的大神 @GM_Joanna_ 发现线段树也能写 odt,我感觉确实。故记录下来。
前置知识:区间推平(颜色段均摊),ODT。
区间推平:指的是对
下面假定你会了 ODT,然后我们下面用线段树实现相似的操作:找到每个被删除的颜色段,然后将他们的颜色设置为某个颜色。
考虑线段树当前节点为
具体找到一个被删除的区间的做法是,维护两个变量
于是做完了。感觉上常数是很小的,实际上测试后发现差不多,甚至线段树有时候比较慢。下面是一些测试数据(单位:秒,程序 A 是 map 实现,程序 B 是线段树实现)。
随机数据:
Results for program A:
Mean: 0.788355, Variance: 0.072245, Std Dev: 0.268784, Range: 1.068930, Median: 0.776874
Results for program B:
Mean: 0.994135, Variance: 0.144233, Std Dev: 0.379781, Range: 1.479207, Median: 1.002931
单点修改(这种也可以卡链表写法):
Results for program A:
Mean: 0.704929, Variance: 0.240140, Std Dev: 0.490040, Range: 1.690491, Median: 0.508689
Results for program B:
Mean: 0.284956, Variance: 0.031118, Std Dev: 0.176404, Range: 0.608953, Median: 0.229302
这个测试在我的 github 仓库上有,感兴趣可以去看看,如果有更好的写法可以找我。代码我在洛谷剪贴板也放了一份。