以前写线段树常数巨大,因为懒所以一直没改,今天终于下定决心把线段树常数调小
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