首先我们贪心的考虑,对于某一天来说,我们只有3中策略,第一种为不做任何行动,这时的答案与前一天相同,第二种为将自己的钱全部换成a,b货币,因为如果换a,b货币,代表在之后的某一天卖出去后会赚钱,那么当时手中的a,b货币越多,盈利越多,所以全买。第三种策略为将自己的货币全部卖出,贪心正确性和第二种类似。

  那么我们设w[i]为到第i天,手中最多有多少钱,那么就可以比较容易的列出转移方程w[i]=max(w[i-1],第j天将所有的货币卖出,第i天卖掉的钱),这样的时间复杂度为n^2,显然不能通过全部测试数据,那么我们考虑优化。

  w[i-1]比较容易考虑,那么我们现在要求的就是对于固定的i,第j天将所有的货币卖出,第i天卖掉的钱的最大值,设这个为tot,那么我们用式子表示出这个来,因为第j天剩下w[j]的钱,那么我们可以换成a货币w[j]/(a[j]+b[j]*rate[j]),b货币为rate[j]*a货币,那么设x[i]为第i天的钱全部换成a货币的数量,y[i]为第i天的钱全部换成b货币的数量,那么则有x[i]=w[i]/(a[i]+b[i]*rate[i]),y[i]=x[i]*rate[i],那么第j天的货币在第i天卖掉获得的钱为a[i]*x[j]+b[i]+y[j],那么w[i]=max(w[i-1],a[i]*x[j]+b[i]*y[j]),现在我们求的就是z=a[i]*x[j]+b[i]*y[j]的最大值,那么用线性规划的方法,y[j]=z/b[i]-x[j]*a[i]/b[i],显然当使斜率为-a[i]/b[i]的直线的纵截距最大的时候答案最优,那么我们只需要维护一个x,y坐标的下凸壳即可。

  但是这道题的x坐标显然没有什么单调性,所以我们可以用splay来维护。

/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ //By BLADEVIL
const
eps =1e-9; var
n :longint;
w, a, b, rate :array[..] of extended;
x, y :array[..] of extended;
lk, rk :array[..] of extended;
root :longint;
son :array[..,..] of longint;
father :array[..] of longint; function max(a,b:extended):extended;
begin
if a>b then exit(a) else exit(b);
end; procedure init;
var
i :longint;
begin
read(n,w[]);
for i:= to n do read(a[i],b[i],rate[i]);
end; function fabs(x:extended):extended;
begin
if x> then exit(x) else exit(-x);
end; procedure rotate(x:longint;var root:longint);
var
y, z, p, q :longint;
begin
y:=father[x];
z:=father[y];
if son[y][]=x then p:= else p:=;
q:=p xor ;
if y=root then root:=x
else if son[z][]=y then
son[z][]:=x else son[z][]:=x;
father[x]:=z; father[y]:=x;
father[son[x][q]]:=y;
son[y][p]:=son[x][q];
son[x][q]:=y;
end; procedure splay(x:longint;var root:longint);
var
y, z :longint;
begin
while x<>root do
begin
y:=father[x];
z:=father[y];
if y<>root then
if (son[y][]=x) xor (son[z][]=y)
then rotate(x,root) else rotate(y,root);
rotate(x,root);
end;
end; procedure insert(var t:longint;anc,now:longint);
begin
if t= then
begin
t:=now;
father[t]:=anc;
exit;
end;
if (x[now]<=x[t]+eps) then
insert(son[t][],t,now) else
insert(son[t][],t,now);
end; function getk(i,j:longint):extended;
begin
if fabs(x[i]-x[j])<eps then exit(-maxlongint);
exit((y[j]-y[i])/(x[j]-x[i]));
end; function prev(root:longint):longint;
var
rot, tmp :longint;
begin
rot:=son[root][];
tmp:=rot;
while rot<> do
begin
if (getk(rot,root)<=lk[rot]+eps) then
begin
tmp:=rot;
rot:=son[rot][];
end else rot:=son[rot][];
end;
exit(tmp);
end; function succ(root:longint):longint;
var
rot, tmp :longint;
begin
rot:=son[root][];
tmp:=rot;
while rot<> do
begin
if (getk(root,rot)+eps>=rk[rot]) then
begin
tmp:=rot;
rot:=son[rot][];
end else rot:=son[rot][];
end;
exit(tmp);
end; procedure update(t:longint);
var
left, right :longint;
begin
splay(t,root);
if son[t][]<> then
begin
left:=prev(root);
splay(left,son[root][]);
son[left][]:=;
lk[t]:=getk(left,t);
rk[left]:=lk[t];
end else lk[t]:=maxlongint;
if son[t][]<> then
begin
right:=succ(root);
splay(right,son[root][]);
son[right][]:=;
rk[t]:=getk(t,right);
lk[right]:=rk[t];
end else rk[t]:=-maxlongint;
if (lk[t]<=rk[t]+eps) then
begin
root:=son[t][];
son[root][]:=son[t][];
father[son[t][]]:=root;
father[root]:=;
rk[root]:=getk(root,son[t][]);
lk[son[t][]]:=lk[root];
end;
end; function find(t:longint;k:extended):longint;
begin
if t= then exit();
if (lk[t]+eps>=k) and (k+eps>=rk[t]) then exit(t);
if (k+eps>lk[t]) then
exit(find(son[t][],k)) else
exit(find(son[t][],k));
end; procedure main;
var
i :longint;
p :longint;
begin
for i:= to n do
begin
p:=find(root,-a[i]/b[i]);
w[i]:=max(w[i-],x[p]*a[i]+y[p]*b[i]);
y[i]:=w[i]/(a[i]*rate[i]+b[i]);
x[i]:=y[i]*rate[i];
insert(root,,i);
update(i);
end;
writeln(w[n]::);
end; begin
init;
main;
end.

bzoj 1942 斜率优化DP的更多相关文章

  1. bzoj 1010 斜率优化DP

    我的第二道斜率DP. 收获: 1.假设两个位置:p<q<i,然后让某一位置优,看其满足什么性质,所谓斜率优化就是满足: (g[q]-g[p])/(f[q]-f[p])  op h[i] 要 ...

  2. bzoj 1096 斜率优化DP

    首先比较容易的看出来是DP,w[i]为前i个工厂的最小费用,那么w[i]=min(w[j-1]+cost(j,i))+c[i],但是这样是不work的,复杂度上明显过不去,这样我们考虑优化DP. 设A ...

  3. bzoj 3437 斜率优化DP

    写题解之前首先要感谢妹子. 比较容易的斜率DP,设sum[i]=Σb[j],sum_[i]=Σb[j]*j,w[i]为第i个建立,前i个的代价. 那么就可以转移了. /**************** ...

  4. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  5. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  6. BZOJ 1010: 玩具装箱toy (斜率优化dp)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy(斜率优化dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k ...

  8. BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...

  9. 【BZOJ】1911: [Apio2010]特别行动队(斜率优化dp)

    题目 传送门:QWQ 分析 用$ dp[i] $ 表示前 i 个人组成的战斗力之和 然后显然$ dp[i]=Max (  dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum ...

随机推荐

  1. LaTeX工具——mathpix安利

    官网: https://mathpix.com/ 效果看下图: 图片打不开点这里 识别效果还行,感觉很适合jbc/zcy这种不喜欢打LaTex公式的神仙.

  2. eclipse 列编辑

    ALT + SHIFT +A 进入列编辑模式,可以一次性操作多行列. 再次按住 ALT + SHIFT +A 则退出列编辑模式.

  3. MySQL☞order by与distinct

    asc(升序,默认值)/desc(降序) 1.根据某一列的列值进行升序或者降序操作. select  列名 别名 from 表名 order by 列名 asc/desc 2.根据多个列值进行排序 s ...

  4. 会话描述协议(SDP)介绍

    1.SDP的引入 SDP最初用于Mbone(组播骨干网)上的多媒体会议.Mbone 是Internet 的一部分,它的主要特征是对IP组播技术的使用.IP组播技术比较适合实现多方会话. 基于组播的会议 ...

  5. 【Autofac】- 创建的类的生命周期

    1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...

  6. (转)Foundation-性能优化之NSDateFormatter

    性能优化之NSDateFormatter 为什么要优化NSDateFormatter? 首先,过度的创建NSDateFormatter用于NSDate与NSString之间转换,会导致App卡顿,打开 ...

  7. flask-sqlalchemy 用法总结

    Flask-SQLAlchemy是一个Flask扩展,能够支持多种数据库后台,我们可以不需要关心SQL的处理细节,操作数据库,一个基本关系对应一个类,而一个实体对应类的实例对象.Flask是一个轻量级 ...

  8. Codeforces Round #518 Div. 1没翻车记

    A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数.大力dp前缀和优化即可. #include<iostream> #include<cstdio& ...

  9. hihocoder 1465 循环串匹配问题(后缀自动机)

    后缀自动机感觉好万能 tries图和ac自动机能做的,后缀自动机很多也都可以做 这里的循环匹配则是后缀自动机能做的另一个神奇功能 循环匹配意思就是S是abba, T是abb 问'abb', 'bba' ...

  10. [洛谷P1361]小M的作物

    题目大意:将作物种在A,B两地,对于每种作物,种A,B分别有不同的收益,对于一些特殊的作物集合,共同种到A,B集合分别有一些额外收益.求最大收益. 题解:最小割,S向i连容量为$a_i$的边,i向T连 ...