关于如何减小线段树常数

来源:互联网 发布:帝国cms投票系统 编辑:程序博客网 时间:2024/06/06 05:35

以前写线段树常数巨大,因为懒所以一直没改,今天终于下定决心把线段树常数调小

0.位运算,前置技能

1.非递归是一定要有的,以前觉得非递归特别特别麻烦,今天写了一下发现比递归好写敲打

2.不要一直改变l,r,能在build时记录下来就不要每次更新了

3.能从下往上修改就从下往上吧

4.线段树不管什么地方,加一句话常数都会变大,如果是加个函数就更大了

比如说我们会记录最大值

mx[now]=max(mx[now<<1],mx[now<<1|1])

这样慢哭

改成

if(mx[now<<1]>mx[now<<1|1])mx[now]=mx[now<<1];

else mx[now]=mx[now<<1|1]

会快很多

5,update写成宏

6.其实这点很重要:能调用两次线段树能解决的问题绝不调用三次

举个例子,我要询问k大和删除k大,我可以边跑边修改,这样少调用一次

7,永久标记多了会特别特别慢,谨记

8,其实有时候不用记录当前询问区间

什么意思呢,比如我要询问k大 ,那么不用记录当前的l和r,一路询问下来,在叶子打一个return标记就好


大致优化到了第3(顺便缅怀T掉的splay

1 0