AGC007

可能讲得很不清楚,因为是没心情的时候写的。

A

直接判即可。

B \((\texttt{Easy} \ 2 / 0)\)

\(a_i\) 的初始值为 \(i\)\(b_i\) 的初始值为 \(n - i + 1\)。对于每个 \(i\),把 \(a_{1 \sim p_i}\) 加上 \(i\),把 \(b_{p_i \sim n}\) 加上 \(i\) 即可。这样最终 \(a_{p_i} + b_{p_i} = n + 1 + \frac{n(n + 1)}{2} + i\),也保证了 \(a, b\) 的单调性。

时间复杂度 \(\mathcal{O}(n)\)

C \((\texttt{Medium} \ 5 / 0)\)

根据期望的线性性可以得到一次操作后距离的期望依然构成等差数列,而操作一次的期望长度为 \(d + \frac{(2n - 1)x}{2}\),所以可以递归解决。具体地,我们有 \(d' = d + \frac{2d + 5x}{2n}, x' = x + \frac{2x}{n}\)

时间复杂度 \(\mathcal{O}(n)\)

D \((\texttt{Easy} \ 2 / 0)\)

可以通过调整法证明最优解肯定可以被分为若干段,每一段是先走完,再走回去捡这一段的金币,捡完再往前走。于是可以直接 \(\rm dp\) 了,使用单调队列或者枚举转折点。

时间复杂度 \(\mathcal{O}(n)\)

E \((\texttt{Easy} \ 3 / 1)\)

首先二分答案,转为判定问题。发现走到子树内必然是把子树内所有叶子都走完再出去,设 \(w_u\) 表示 \(u\) 的带权深度,\(f_{u, x}\) 表示以 \(u\) 为根的子树内,走的第一个叶子深度为 \(x\),最后一个叶子的最小深度,转移是平凡的。

发现如果对于 \(x \le y\),有 \(f_{u, x} \le f_{u, y}\),那么 \(f_{u, y}\) 是没有必要的。所以假设左右子树的有效状态数分别为 \(L, R\),则当前节点的有效状态数是 \(\mathcal{O}(\min\{L, R\})\) 的,所以时间复杂度是 \(\mathcal{O}(n \log n \log \omega)\),可以通过。

刚开始看错题还想了好久。

F \((\texttt{Easy} \ 4 / 2)\)

发现操作的过程类似于一个字符可以向右和向下走。

从后往前处理,对于 \(t\) 中的每一段相同字符,找到 \(s\) 中不在其左端点右边的最靠右的该字符所在的位置,考虑把该字符挪到其左端点的位置。

用队列维护那些需要向下走的位置。

时间复杂度 \(\mathcal{O}(n)\)

比较容易想错和想不清楚细节。

posted @ 2022-03-21 09:44  Scintilla06  阅读(60)  评论(0)    收藏  举报