圆方树(如何判断树上 $z$ 在 $x,y$ 的简单路径上)

P4606 [SDOI2018] 战略游戏

狗屎 虚树 + 圆方树。

顺便第一次打 欧拉序求 LCA。

注意特判根节点的情况即可,甚至不需要 dp。

P4334 [COI2007] Policija

sblhy 直接给我交题解了,那我就不打了。

说一个最重要的点:如何判断树上 \(z\)\(x,y\) 的简单路径上?

dfn 序:满足两个条件。

  1. \(x,y\) 至少有一个在 \(z\) 的子树中。

  2. \(z\)\(lca(x,y)\) 的子树中。

树剖:在跳 LCA 的过程中判断被删点是否在起终点之间,我们用链首和深度判断即可。参考:

	inline bool LCA(int x,int y,int z){
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]])swap(x,y);
			if(top[x]==top[z] and dep[z]<=dep[x]) return 1;
			x=fa[top[x]];
		}
		if(dep[x]<dep[y])swap(x,y);
		if(top[x]==top[z] and dep[z]>=dep[y] and dep[z]<=dep[x]) return 1;
		return 0;
	}

倍增:简单的,不提及。

最短路

绅士提到了一个问题。拿出来讲讲,有意思。

就是这个题中,我们需要求出一个点在环上的与一个起点的距离。

直观的想法就是 \(a_x\) 表示。除开方点的父亲那个点。

问:\(x\) 有可能在多个点双,信息是否唯一?

注意到若 \(x\) 已经在一个点双的非父亲圆点上了,那么接下来的情况,\(x\) 只能作为方点的父亲了。

是不是很显然,故不影响。

P8456 「SWTR-8」地地铁铁

posted @ 2024-07-16 20:27  LCat90  阅读(6)  评论(0编辑  收藏  举报