CF226E Noble Knight's Path

发布时间 2023-11-11 19:47:25作者: 蒟蒻·廖子阳

重链剖分真可爱,数据结构真可爱。

tags:

  • \(\text{data structures}\)

  • \(\text{trees}\)

  • $\color{red}{*2900} $

洛谷 CF

  • 给出一棵 \(n\) 个点的树,初始所有点为白色。还有 \(q\) 次操作,第 \(i\) 个操作发生在第 \(i\) 个时刻,初始状态时刻为 \(0\)。每次操作为:

    • \(1\texttt{ }u\),将 \(u\) 变成黑色。保证每个点只会发生一次 \(1\) 操作。

    • \(2\texttt{ }a\texttt{ }b\texttt{ }k\texttt{ }y\),查询从 \(a\) 走到 \(b\)有向路径上,第 \(k\) 个没有在 \([y+1,i]\) 中的时刻被染成黑色的点编号。有向路径不含 \(\boldsymbol{a,b}\)

  • \(n,q\le 10^5\)

  • \(4.00\text{ s}\, /\, 250\text{ MB}\)

考虑重剖套主席树维护 \(dfn\) 区间内在 \([0,i]\) 时刻有多少个点被染成黑色。\(1\) 操作在之前版本上修改,\(2\) 操作直接继承上一版本。

对于查询,找到并按顺序存放 \(a,b\) 路径上(不含 \(a,b\))的重链 \(dfn\) 区间。考虑确定第 \(k\) 个点在第几条重链上。

可以通过主席树 \([0,i]\) 版本和 \([0,y]\) 作差得出这条链内 \([y+1,i]\) 时刻有多少个点被染成黑色,然后再用链的长度减去这个值就可以得到这条链这个时刻区间内没被染成黑色点的个数。

枚举一条链时,若当前所有链的满足条件的点个数总和 \(cnt\) 不足 \(k\),则跳到下一条链,否则就是查询这条链上第 \(k-cnt\) 个满足条件的点。

这个点一定满足,这条链上以其为结尾的前缀的满足条件的点的个数 \(\ge k-cnt\),且这个前缀长度最小。容易发现答案具有单调性,二分 + 主席树即可。

注意前缀是对于这条链在路径上的子串而言的,要注意这条链的方向。

时间复杂度为 \(\mathcal{O}(q\log^2 n)\),空间复杂度为 \(\mathcal{O}(q\log n)\)。离线做法可以做到空间 \(\mathcal{O}(n+q)\)

提交记录(\(\color{limegreen} \bf{Accepted}\) \(\,780\text{ ms}\,/\,63.43\text{ MB}\),含代码)