其实是偷懒不想写好多篇。
Table of Contents
BZOJ 1577
Description
公交车一共经过$N(1 \le N \le 20000)$个站点,从站点$1$一直驶到站点$N$。
$K(1 \le K \le 50000)$群奶牛希望搭乘这辆公交车。第$i$群牛一共有$M_i(1 \le M_i \le N)$只. 他们希望从$S_i$到$E_i$去。
公交车只能坐$C(1 \le C \le 100)$只奶牛。而且不走重复路线,请计算这辆车最多能满足多少奶牛的要求。
注意:对于每一群奶牛,可以部分满足,也可以全部满足,也可以全部不满足。
Solution
贪心。
线段树上维护区间min,按右端点排序,每次让当前时间下车的牛能上的都上车。
右端点相同时,选左端点靠后的不会变差。
区间减就可以了。
1 |
|
BZOJ 2216
决策单调性DP。
Description
给一个长度为$n$的序列 $a_1, a_2, \ldots, a_n$.
对于每一个 $i \in [1, n]$, 计算最小的非负整数$p$, 使得对于任意$j$, 有$a_j \le a_i + p - \sqrt{|i-j|}$.
Solution
第一眼以为是单调队列做的… 但其实信息没法转移的.
第一次做一般的决策单调性优化, 平时都是斜率优化或者四边形不等式之类的…
首先方程可以很容易的变个形: $p_i = min\{ a_j + \sqrt{|i-j|} - a_i \}$
我们来证明决策点的单调性.
考虑 $p_i$ 的最优决策点在 $g_i$. 那么有任意 $k > 0$, 满足$a_{g_i - k} + \sqrt{i - g_i + k} \le a_{g_i} + \sqrt{i - g_i}$.
然后sqrt的斜率是在降的, 因为 $\frac{d}{dx} \sqrt{x} = \frac{1}{2\sqrt{x}}$.
这样的话,我们将决策点向前移动时,就会有:
$\because i - g_i + k > i - g_i$
$\therefore \sqrt{i + 1 - g_i + k} - \sqrt{i - g_i + k} < \sqrt{i - g_i} - \sqrt{i + 1 - g_i}$
$\therefore a_{g_i - k} + \sqrt{i + 1 - g_i + k} < a_{g_i} + \sqrt{i + 1 - g_i}$
也就是说, 在当前决策最优的情况下,下一位的决策点一定不会后退。
这样我们在求解出一个 $p_i$ 后, 就可以二分地更新它可以作为后面多少个位置的决策点了.
用一个三元组表示 $pos$ 决策点的有效区间 $[l, r]$, 在单调队列/单调栈中维护即可.
这是通常意义的决策单调性优化DP.
1 |
|
Orz 黄学长, Miracle
BZOJ 5055
膜法树状数组.
Description
给定长度为 $n$ 的序列 $a[]$.
求出所有满足$i<j<k$ 且 $a_i<a_j<a_k$ 的 $a_i \times a_j \times a_k$ 的和
即求 $\sum_{i < j < k \wedge a_i < a_j < a_k} {a_i \times a_j \times a_k}$.
Solution
开始的想法是先求出一个数后面比他大的数的和, 计算出 $a_j \times a_k$ 那一部分,然后再做一次同样的事,计算第一个数。
但其实有个更好想也好写的做法。就是直接把前面比这个数小的,后面比这个数大的,和自己乘起来,就可以直接累加答案了。
树状数组维护即可。
1 |
|