Loading

【题解】CF1514E Baby Ehab's Hyper Apartment

首先竞赛图缩点是一条链状 DAG,拥有唯一拓扑序,如果能知道缩点后的结果就很容易得到答案了。

首先考虑找到一条长度为 \(n\),包含 \([0,n-1]\) 所有点的路径。注意到 \(a\rightarrow b\) 意味着 \(a\) 缩点后所属的大点一定不在 \(b\) 所属的大点之后,所以最终缩点得到的结果肯定是对应了这条路径上的每段区间。

此时考虑怎么找路径。首先考虑分治,找出 \([l,mid]\)\([mid+1,r]\) 的路径,接下来考虑拼接,考虑两个路径的头分别为 \(a,b\),如果有 \(a\rightarrow b\),那么新路径一定能用 \(a\) 做头,接下来是接的 \(b\) 还是 \([l,mid]\) 路径上的第二个节点都是满足要求的——这个是原问题的子问题。

思考归并排序的过程,可以发现两者本质一样,所以可以直接套用归并排序的复杂度,这一部分是 \(O(n\log n)\) 的。(\(n\leq 100\) 的话 \(\log n\) 大概为 \(7\),满足限制)。

接下来就是找区间,考虑从后往前找,维护当前可以到达的最前的点是多少,注意到如果 \(i\) 最远能到 \(j\),若 \(i=j\) 那么 \(i\) 就是一个区间的左端点了,否则 \(i-1\) 也一定能最远到达 \(j\),只需要在 \(i-1\)\(j\) 往前考虑即可,实际询问次数满足要求(最多询问出 \(n\)\(1\),也最多询问出 \(n\)\(0\))。

代码:Submission #127654693 - Codeforces

重点是竞赛图缩点成链状 DAG的结论,还有是对归并排序的应用。

posted @ 2021-09-02 09:56  Qiuly  阅读(78)  评论(0编辑  收藏  举报