如果你WA 30pts,方法是对于每个重链排序并标记,然后考虑每个玩家。在重链上二分,区间加,最后每个节点查看答案(我自己想的,如果不一样跳过):
以左链(x->lca(x,y))举例,找的是在左链上w[u]+dep[u]==dep[x]的u的数量,那假设a,b都在左链上(dep[b]<dep[a]),现在要在这里查询。
注意链被打乱了了,二分时应该在整条链上,也就是top[a]->button[a] (b亦可),而不是b->a,然后在top[a]->button[a]上查询满足w[u]+dep[u]==dep[x],并且在b->a上的u的数量。
那么可以让v0[dfn[重链顶]]到v0[dfn[重链尾]]的每个元素u成为{w[u]+dep[u],dfn[u]!!!不是u},然后再在[lower_bound({dep[x],dfn[重链顶]}),lower_bound({dep[x],dfn[重链尾]+1}))区间加。
另外一样。
注意如果这样写,那么i对应的是v0,v1中dfn[i]的位置。
我这里应该已经包含了五个警示了。
附加调试方法:如果你正着样例对了,不妨把v0改成{-w[u]-dep[u],dfn[u]},然后查询的时候查询-dep[x]。
附加右链式子,以防推错:v1:{w[i]-dep[i],dfn[u]},查询:dep[x]-2*dep[lca(x,y)],同样可以全部取反调试。
另一个经验(刚刚调到)
最后cx,cy移动到同一个重链上时(为了避免混淆,移动的是cx,cy,查询的链是x->y):
cx在上,y在下,再交换,然后反转在链情况(在x->lca(x,y)还是y->lca(x,y))。效果:cx下cy上
或者:cx在下cy在上,再交换,否则反转在链,效果cx上cy下。
也适用于其他题,迁移时注意,适当修改。