CF1889D

发布时间 2023-10-30 20:40:00作者: Grice

题意

给定\(n\)个栈,栈的大小分别为\(k_i\),每个栈内元素\(\in[1,n]\),记从第\(i\)个栈开始的答案为\(ans_i\),流程:若栈\(i\)为空,答案为\(i\);否则弹出栈顶元素\(x\),并前往栈\(x\),继续刚才的操作。
\(n\le 10^5,\sum k_i\le 10^6\)

做法

考虑弱化情况,\(k_i=1\),记栈\(i\)元素为\(p_i\),建图\(i\longrightarrow p_i\),图为根向基环森林,将环边全部删掉,为根向森林,不难发现每个栈的答案为该点所在树的根

考虑原题,我们发现:取出栈顶元素同弱化情况一样建图,对于所有在环上的点,将该栈的栈顶元素弹出,不影响答案。

反复进行该操作即可,容易做到线性复杂度