ABC 341
前五题水。
提一嘴 D:应该是 x/n + x/m - 2 * x/lcm(n,m)
,而不是 x/n + x/m - 2 * x/nm
!
题意:
给定图。每个点有权值 \(w\)。初始每个点有 \(a_i\) 个片。每次操作可以选定一个有片片的点,拿走它的一个片片,然后从它的邻点中选若干个,要求满足选出的点权值总和小于该点权值,把选出的点片片数量+1。
问:最多能操作几次?\(n,m,w_i\le 5000\)。
考虑对每一个点求出 \(v_i\) 表示在这个点上的一个片,能衍生出多少次操作。
按 \(w_i\) 从小到大将点排序。记 \(mn\) 为 \(w_i\) 的最小值。显然 \(w_i=mn\) 的只会衍生一次操作。
对于 \(w_i>mn\) 的,做个背包就行了。
求出 \(v_i\) 之后,\(\sum v_i\times a_i\) 就是答案。
题意(抽象过):有 \(n\) 个点 \(p_i=(i,s_i)\),对于每个 \(p_i\),求出 \(p_{i+1}\sim p_n\) 中哪个点与其组成的斜率最大。
用单调栈维护每个点。
显然 \(ans[n]\) 的答案很简单。让栈内放一个点 \(n\)。然后从 \(p_{n-1}\) 往前扫。
当我们枚举到 \(p_i(i,s_i)\),如果当前栈顶与 \(p_i\) 的斜率不如栈顶下方的点与 \(p_i\) 的斜率大,则当前栈顶永远不会有用了,pop 即可。不断 pop 完后,栈顶就是 \(p_i\) 的答案。