一个直接的想法是拓扑排序时从小到大标号:每次在入度为 \(0\) 的点中找到 \(l_{u}\le i\) 且 \(r_{u}\) 最小的 \(u\),令 \(p_{u}=i\)
问题是如果 \(r_{u}\) 很大,那么 \(u\) 被标号的优先级很低,会连累 \(u\) 的后继中 \(r\) 较小的点
做法是倒着拓扑一遍,令 \(r_{u}\leftarrow \min_{(u,v)\in\mathbb{E}}\{r_{u},r_{v}-1\}\)
下面证明任意合法方案可以被调整成一个能被构造出来的合法方案。方便起见,对图上结点重新编号使得原合法方案中点 \(i\) 的标号为 \(i\),即 \(p_{i}=i\)
设 \(x\) 为第一个不满足上述构造的位置,即标 \(x\) 时,存在入度为 \(0\) 的点 \(y>x\) 满足 \(l_{y}\le x,r_{y}<r_{x}\)。证明让 \(y\) 在 \(x\) 之前标号(即令 \(p'_{y}=x,p'_{x}=x+1,\cdots,p'_{y-1}=y\))仍合法:
\(y\) 的入度为 \(0\),因此仍满足拓扑序
只有 \(y\) 的标号减小了,\(l_{y}\le x=p'_{y}\)
\(i=x,\cdots,y-1\) 的标号增大了,\(y\le r_{y}\le r_{i}\)