mc

Description
小C在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,
每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场
(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),
每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),
而且该花费等于它到控制它的控制站之间的牧场数目(不包括自身,但包括控制站所在牧场)乘上该牧场的放养量,
在第i个牧场建立控制站的花费是ai,每个牧场i的放养量是bi,理所当然,小C需要总花费最小,但是小C的智商有点不够用了,所以这个最小总花费就由你来算出啦。
Input
第一行一个整数 n 表示牧场数目
第二行包括n个整数,第i个整数表示ai
第三行包括n个整数,第i个整数表示bi
Output
一行一个整数表示最小花费
Sample Input
样例输入:

4
2 4 2 4
3 1 4 2

样例输出:

9

样例解释:选1,3,4建 费用为2+1*1+2+4=9
HINT
数据范围:

对于40%的数据n < 1000
对于100%的数据n < 1000000,ai,bi < 1000


f[i] = sigma(j, 0, i - 1) (f[j] + (s[i] - s[j]) * i -plus[i] + plus[j]) + a[i]
= f[j] + s[i] * i - s[j] * i - plus[i] + plus[j] + a[i]
令 k < j 且 j 比 k优
则有
f[k] + s[i] * i - s[k] * i - plus[i] + plus[k] + a[i] > f[j] + s[i] * i - s[j] * i - plus[i] + plus[j] + a[i]
f[k] - s[k] * i + plus[k] > f[j] - s[j] * i + plus[j]
f[j] - f[k] + plus[j] - plus[k] < i * (s[j] - s[k])
(y[j] - y[k]) / (x[j] - x[k]) < i
令 l < k 且 slope(k, l) > slope(j, k)
则有
① slope(k, l) > slope(j, k) > i, 则虽有k比j优, 但又有l比k优, 所以可排除k
② slope(k, l) > slope(j, k) < u, 则有j比k优, 排除k
综上, 在队尾插入时, 出队直至保证slope(k, l) < slope(j, k)
在维护队头时, 出队直至slope(i, j) > i

原文地址:https://www.cnblogs.com/ZeonfaiHo/p/6402848.html