<span>模拟102 题解</span>
A. 你相信引力吗
显然是单调栈处理。
然而优弧/劣弧两种情况,加上高度存在相同,就比较难处理。
然而环是可以平移的,所以一个好的方法是将其中的最大值移到一个端点,
于是跨环端点的情况只出现在 右半部分形成一个单调不降的序列。
顺便去重就可以了。
B. 停不下来的团长奥尔加
打表发现$dp_i=2*dp_{i-1}-dp{f_i-1}+2$
$dp_n$为最终的答案。
将式子拆一下,似乎正确性还挺显然的。
当队长到$i$的时候,前面的点都被经过了偶数次,
所以问题是类似的,可以进行$dp$。
用前缀和来做到直接统计区间的信息。
C. Lesson5!
问题是$DAG$删一个点情况下的最长路。
似乎有一个经典的做法来解决这个问题。
在本题中即最长路径生成树。
删掉一个点$x$意义下的最长路,存在两种情况:
终点不是$x$的子树:预处理出答案,之后可以用$dfs$序,区间维护信息解决。
终点是$x$的子树:那么存在一条路径$a \rightarrow b$,满足$a$不在$x$子树中而$b$在。
预处理出每个点到达终点的最长路径$dis_i$,由超级源点$S$到每个点的最长路径$dep_i$。
即$ans_x$对$dep_a+dis_b+1$取$max$。
枚举边$(a,b)$,可以用树剖来支持取$max$操作。
一个巧妙的做法是提前将所有的$dep_a+dis_b+1$从大到小排序,
所以每个点只需要第一次被更新,之后可以直接跳过。
所以可以用类似并查集的结构维护这个东西。