对于区间问题,我们常用的方法是线段树。递归式的线段树具有通用性,但速度太慢。ZKW神犇使用非递归的线段树,常数特别小。
与大部分线段树一样,ZKW线段树采用堆式存储。也就是说,x节点的左儿子是x*2,右儿子是x*2+1,父亲是x/2。
由于采用非递归,我们要方便地找到叶子节点。ZKW线段树的方法是,从小到大枚举叶子节点数,直到线段树装得下。比如建立1000个节点,他从1开始枚举,2,4,8,16,……1024。发现1024足够大时,将[1, 1024)作为非叶节点,[1024, 2048)为叶子节点。