洛谷P3372 写了一下午线段树模板的感想(无代码)

一、算法分析

断断续续看了一段时间线段树,开始时其实是很懵的,感觉相对ST表、树状数组(蓝书上树状数组那个图一看就懂了)之类的来讲,线段树难不少于是将之搁置数天,直到今天早上又拿起来看,突然感觉这个实际上其实就是一个二分区间然后递归求解的过程,然后对每个节点加入了一个附加值用来暂存增量以进行优化,于是恍然大悟,我的理解是任何一个区间都可以用二分区间的方法进行拆分,比如1到8就是1到8,但是1到7怎么表示,就可以把1到7上面的1到8拆开,为什么是1到8拆开,因为8恰好是2的3次方且恰好大于7,像16就太大,4就太小。然后1到8可以拆成1到4和5到8,1到4包含在1到7里,就直接取走了不用再向叶子节点走,5到8则继续拆分(实质和1到7的拆分是一样的),显然这里每次拆分的子问题都有相同的解决方式,因而可以用递归来进行实现。

二、感言

没错,本文没有代码,因为自己搞好久没整出来,心态有些小崩,这又是一个板子题,就在理解的基础上看了题解改了改交了。当然想要模板网上实在太多了,作者从下午一点有思路之后疯狂调试到现在六点多,中间经历了各种问题,比如:
1.想用位运算计算乘以2除以2结果没好好看位运算的优先级,想秀一波结果把代码秀炸了,这里要注意位运算的优先级,像这样的 x+y<<1,是先将x+y算出来,再算<<1操作的,结果自己挑了半天。
2.发现区间修改和区间访问的函数有很多重合的地方,就开始了复制粘贴大法,写完区间修改就复制了一些到访问里面,结果一直出错,深刻感觉自己的方法不对,复制粘贴很多时侯是有必要的,但是应该着眼于整体的架构和功能实现上,而不是像我一样着眼在语法上。
3.关于调试上面,自己第一版写完之后自我感觉还良好,一百行左右代码几乎没有语法问题(这里的所谓“没有语法问题”指的是点击编译不会报错),但是运行就一直是死循环。然后没办法,就用输出变量法来检查,从头到尾排查,结果发现是因为自己有一个变量是long long,但是写成了"%d"。。。就这样简单的问题改了好久,这个作者要深刻反思自己,之后不能一有问题就直接用输出变量法进行调试,更不能想当然地认为没有编译错误就等于没有语法错误!!!应该有问题之后,先仔细把代码过一下,看看有没有编译器不报错的语法错误存在。
4.关于变量名上面,自己的那个存线段树的数组,居然起名叫tree,节点编号居然起名叫root,虽然稍有些形象,但是对于这种要非常频繁使用的变量名,一定要把名字起得短一些。。。否则代码将会变得很长很长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值