如果在第 t 天早上有一个对结点 q 的询问,在第 s(s<t) 天晚上出现的结点 x 对其有贡献(初始的视为在第 0 天晚上)当且仅当其满足以下两个条件: 1. x 在 q 的子树中。 2. 这段时间内 x 没有因为脱落酸或者涛涛离开这棵子树。
对于 1,可以转化为 idx∈[idq,idq+sizeq)。其中 idx 表示 x 的 DFS 时间戳,sizex 表示 x 的子树大小。
对于 2,可以转化为 depx−depq≥t−s−1。其中 depx 表示 x 的深度。
第二个式子,我们进行移项,变为 depx+s+1≥depq+t,这样左边只跟 x 有关,右边只跟 q 有关。
然后呢?
显然地,这样就把在第 t 天询问 q 转化成了同时满足 idx∈[idq,idq+sizeq) 和 depx+s+1≥depq+t 的在第 s(s<t) 天晚上出现结点 x 的个数。
所以就离线之后(按时间排序)上树套树辣!
有一个细节,第 s 天晚上可以转化成第 s+1 天早上查询之前,更易理解。
这次吸取了教训,没有手痒敲 FHQ Treap,敲了个树状数组套权值线段树,一遍过掉了。
代码:
1 |
|