LINK:紫荆花之恋
每次动态加入一个节点 统计 有多少个节点和当前节点的距离小于他们的权值和。
显然我们不能n^2暴力。
考虑一个简化版的问题 树已经给出 每次求某个节点和其他节点的贡献。
不难想到我们直接把所有点的答案求出来 直接输出就好了 求所有点的答案 可以上点分治了树状数组维护一波就行了。
但是现在是单点求值。不难想到动态点分治。每个分治的点存一下儿子距自己的距离由小到大排序的结果 我们在对应分治节点上二分 注意减掉自己子树内的贡献即可。
减掉自己子树内的不妨 在每个点处维护自己的父亲到自己的点的距离可以发现 这样建树 查询 都不超过log^2
考虑动态插入一个点 再求值。动态插入我们就需要一棵平衡树来做这个问题了。
可以发现当插入一个点的时候 我们直接插入到对应的点分树上的父亲的下方。
这个时候考虑重构 类似于替罪羊树 我们暴力重构点分树。
参考替罪羊树的复杂度分析 最多重构nlogn个节点 每个节点要重构 维护点分树的形态+每个点的线段树的修改。
复杂度nlog^3?实际远远达不到这个复杂度。
挣扎了一下 维护线段树的话 空间和时间消耗都很大 关键是空间上的问题。
所以点分树上每个节点下不能再吊线段树了 只能吊平衡树 考虑常数原因我们考虑替罪羊树或treap.
可以发现外层已经有替罪羊了 内层还是替罪羊好了 题解中有位神仙给了一种替罪羊选择做法 大体上就是当发现失衡的时候就向上旋转可能在点数较少且容易失衡的时候跑的比较快吧。
决定了 码了这道题。