好久没搞麻烦数据结构了,因此借此题练练手,顺便巩固巩固这神奇的动态树
题目大意很简洁,就是要求你设计一个数据结构,支持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个小时不到就调完了!悲剧兮~~