【pku3237】动态树

好久没搞麻烦数据结构了,因此借此题练练手,顺便巩固巩固这神奇的动态树

题目大意很简洁,就是要求你设计一个数据结构,支持3种操作:

改一个边的边权,把i到j的路径上所有边取反,询问i到j的路径上的最大值

题目很简洁,思路自然也简洁了,就动态树强做嘛!

但实现的时候,还是有一些技巧的,比方说取反,其实只要把i到根取反,再把j到根取反,自然就是把i到j取反了

这里我发现要对i到j的路径进行操作,有通法,如下:

先ACCESS(I);再ACCESS(J)的时候,会发现j往上提的过程中碰到的最后一条路径会是之前i那条,那么这个时候就可以完成你需要的路径操作了,包括算lca什么的都可以这个时候算,只是有时候要注意如果i是j的祖先要处理一下

还有,本题由于有取反标记,所以splay过程要反着来,即先递归到根,再旋(跟平常的splay差不多),有很多细节要注意!!

另外,由于有取反操作,max会变成-min,所以要维护两个值,即max和min

 

代码的话,有点丑,速度嘛。。还行吧

 

哎呀,这题我调了差不多6.7个小时,while盾哥3个小时不到就调完了!悲剧兮~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值