标签:CEG ch 祖先 maxs mid int 最近 公共 树中
Description
Sample Input
15 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 1 2 2 3 3 4 4 5 5 6 6 7 7
1 2
8 11
5 8
8 15
4 6
Sample Output
1
5
4
7
3
HINT
题目求的”最近公共祖先“,实际上是所有公共祖先中编号最大的那一个……
看看怎么把两棵树联系起来。
要同时维护询问的两个点的祖先的并集比较困难,考虑能不能离线简化一下问题。
我们dfs遍历A树,每走到A树的一个点$u$,回答所有形如$(u,v)$的询问,其中$v$是$B$树上的点。
注意到遍历到$u$时,根节点到$u$的路径构成了$u$的祖先集合$F_u$。于是我们就可以转化一下问题,对于每个询问,相当于询问在$F_u$中,是$v$在B树中的祖先的最大值。
预处理出A树中每一个点在B树中的dfn出序和入序,以此刻画出A树的每一个点在B树中对应哪一棵子树。在A树中每遍历到一个点,就给B树中的相应子树中的所有点更新最大值。这些操作用线段树维护B树的dfn序实现。此时问题变得非常简单,此时只需要回答$v$在线段树中相应位置的值即可。
注意到A树的dfs有回溯操作,所以用主席树解决就可以了。主席树是区间修改、单点查询,注意标记永久化。
这题的关键就在于如何转化询问,使得问题变得易于维护。
1 |
|
标签:CEG,ch,祖先,maxs,mid,int,最近,公共,树中 来源: https://www.cnblogs.com/liuzhongrong/p/12365618.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。