关于如何减小线段树常数

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

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值