ABC 341

前五题水。

提一嘴 D:应该是 x/n + x/m - 2 * x/lcm(n,m),而不是 x/n + x/m - 2 * x/nm

F

题意:

给定图。每个点有权值 \(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\) 就是答案。

G

题意(抽象过):有 \(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\) 的答案。

posted @ 2024-02-17 22:02  FLY_lai  阅读(14)  评论(0编辑  收藏  举报