[比赛记录]APIO 2010
A. Commando
设 \(f_i\) 表示恰好以 \(i\) 为一个段结尾,前面的最大战斗力。前缀和数组设为 \(s_i\)。有转移:
\[f_i = \max_{j < i} \{ f_j + \color{red}{{a(s_i - s_j) ^ 2 + b(s_i - s_j) + c}} \}
\]
红色这一坨看起来很凸 / 斜率优化。尝试搞搞斜率。
若 \(j > k\) 且 \(j\) 是决策点,则需要满足:
\[f_j + a(s_i - s_j) ^ 2 + b(s_i - s_j) > f_k + a(s_i - s_k) ^ 2 + b(s_i - s_k)
\]
移项整理得到
\[s_i > \dfrac{f_j - f_k + a(s_j - s_k) ^ 2 - b(s_j - s_k)}{2a(s_j - s_k)}
\]
于是欣然做单调栈。线性。
B. Patrol
\(k = 1\) 是平凡的。找到直径,连起直径的两端,就可以少走一个环。
\(k = 2\) 是,猜到结论:必然有一条路径是直径。
把直径边权设为 \(-1\),再找一遍直径,就是第二条路径。