张果老——醉酒抛杯踢连环
Back ⇐
问题模型
你获得了 n 条链,第 i 条链的长度是 ai。
给这 ∑ai 个点再连上 n−1 条边,使得它们构成一个包含 ∑ai 个结点的“大树”。
请输出最终 可能 成为“大树”重心的结点的个数。
模型分析
对于第 i 条链的第 j 个结点(以下简称点 (i,j)):
-
首先很明显根据“重心”定义,最优策略是把剩下 n−1 条链全部作为子树挂上去。
-
进而分析有解的条件,也就是说:
-
记 x=j−1,y=ai−j(第 j 个点之前、第 j 个点之后的结点数)
-
所以 a1,a2,⋯,ai−1,ai+1,⋯,an,x,y 共同构成点 (i,j) 的子树。
据此只需要判断:
max{a1,a2,⋯,ai−1,ai+1,⋯,an,x,y}≤⌊2∑ai⌋
不妨考虑拆解这个式子:
⎩⎪⎪⎨⎪⎪⎧max{a1,a2,⋯,ai−1,ai+1,⋯,an}≤⌊2∑ai⌋max{x,y}≤⌊2∑ai⌋
第一个式子可以考虑预处理除去 ai 之后的序列 max 值,O(n) 扫描即可。
第二个式子可以考虑对于一个 ai 批量计算(在满足了一式的前提下),考虑奇偶分讨:

由图示结论可得,ai 的贡献是:
-
ai 为偶数:min⎝⎜⎛⎣⎢⎢⎢⎢2j=i∑aj⎦⎥⎥⎥⎥×2+2,ai⎠⎟⎞
-
ai 为奇数:min⎝⎜⎛⎢⎢⎢⎢⎡2j=i∑aj⎥⎥⎥⎥⎤×2+1,ai⎠⎟⎞