进食后人wa30pts
查看原帖
进食后人wa30pts
778881
Lawrence003楼主2025/7/29 19:53

如果你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下。

也适用于其他题,迁移时注意,适当修改。

2025/7/29 19:53
加载中...