问题可以转化为,删除原图当中的一个点(对应序列中的第一个点),从前向后拓扑排序,最多能排多少个点。
先把原图中能排的点排完,剩下每个点的入度都大于 $0$。
可以注意到,如果删除 $x,y$ 后可以排序的点有交,则意味着 $x,y$ 一定有一个点删掉之后能间接排到另一个,从而可以排序的点集呈包含关系。不然的话,考虑这删掉 $x,y$ 后拓扑序最靠前的一个公共点,则这个点一定有只能被 $x$ 和只能被 $y$ 删除的入边,矛盾。
因此删掉每个点能排序的点集之间要么不相交,要么包含,形成一个树形结构。接下来有几种做法:
- 可以直接 shuffle 之后,暴力检验每一个点,跳过被之前的点间接访问过的点,因为这些点一定不是最大值。这样每个点期望只会被访问 $O(\log\mathrm{dep})$ 次,其中 $\mathrm{dep}$ 是其在树形结构上的深度。
- 也可以维护一些集合,满足每个集合都存在一个点能到其余所有点。如果一个集合 $S_1$ 无环且所有入边都在集合 $S_2$ 中,则将这两个集合合并。可以用启发式合并实现。
时间复杂度 $O((n+m)\log n)$。