题目大意:太长了略

splay调了两天一直WA弃疗了

首先,我们可以猜一个贪心,如果买/卖,就一定都买/卖掉,否则不买/卖

反正货币的行情都是已知的,没有任何风险,所以肯定要选择最最最优的方案了

容易得到方程

$dp[i]=max(dp[i-1],a[i]*\frac{dp[j]*rate[j]}{rate[j]*a[j]+b[j]}+b[i]*\frac{dp[j]}{rate[j]*a[j]+b[j]})$

显然是要用凸优化了

splay非常无脑,splay维护此题的凸包,需要找前驱,删前驱,找后继,删后继,一大堆特判...绝对恶心到吐

所以这是一篇$CDQ$分治题解

令$x=\frac{dp[j]}{rate[j]*a[j]+b[j]},y=x*rate[j]$

移项,可得

$dp[i]-b[i]*x=a[i]*y$

$y=\frac{dp[i]}{a[i]}-\frac{b[i]}{a[i]}x$

发现斜率$k=-\frac{b[i]}{a[i]}$是一定的,我们在外层把斜率k从小到大排序,可以优化掉一个$log$,递归时按$x$从小到大排序

这样,递归时,每一层内部都是按$k$有序的,把这一层按照时间分为左右两个部分(不要破坏$k$的有序状态)

先递归处理左半个区间,回溯后,左半部分的答案已知,且不会被右半部分的答案所影响

且左半部分按$x$从小到大排序,右半部分按斜率$k$从小到大排序,取最小值,由于$k<0$,用单调栈维护一个上凸包即可

处理完了左边对右边的贡献,递归处理右半部分

回溯时,先处理$dp[i]=dp[i-1]$的情况,再按$x$排序,回溯到上一层

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 101000
#define M1 205
#define ll long long
#define dd double
#define uint unsigned int
#define inf 233333333
#define il inline
using namespace std; const dd eps=(1e-);
int n,m;
int stk[N1];
dd A[N1],B[N1],r[N1],X[N1],Y[N1],K[N1],f[N1];
//struct node{dd x,y,k,ans;int id;};
int cmp1(int s1,int s2){return K[s1]-K[s2]<;}
int id[N1],tmp[N1];
dd get_slope(int s1,int s2){
if(!s2) return inf;
return (Y[s1]-Y[s2])/(X[s1]-X[s2]);
}
void CDQ(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>;
int tp=,i,j,pl=L,pr=M,k,cnt;
for(int i=L;i<R;i++)
if(id[i]<M) tmp[pl++]=id[i];
else tmp[pr++]=id[i];
for(int i=L;i<R;i++)
id[i]=tmp[i];
CDQ(L,M);
for(i=L;i<M;i++)
{
k=id[i];
if(tp>&&fabs(X[stk[tp]]-X[k])<eps&&Y[k]-Y[stk[tp]]<eps) continue;
while(tp>&&get_slope(stk[tp],stk[tp-])<=get_slope(k,stk[tp-]))
tp--;
stk[++tp]=k;
}
for(i=M;i<R;i++)
f[i]=max(f[i-],f[i]);
for(i=M;i<R;i++)
{
while(tp>&&get_slope(stk[tp],stk[tp-])<=K[id[i]])
tp--;
k=id[i],j=stk[tp];
f[k]=max(f[k],A[k]*Y[j]+B[k]*X[j]);
X[k]=f[k]/(A[k]*r[k]+B[k]);
Y[k]=r[k]*X[k];
}
CDQ(M,R);
i=L,cnt=L,j=M;
while(i<M&&j<R){
if(X[id[i]]<X[id[j]])
tmp[cnt++]=id[i],i++;
else
tmp[cnt++]=id[j],j++;
}
while(i<M) tmp[cnt++]=id[i],i++;
while(j<R) tmp[cnt++]=id[j],j++;
for(i=L;i<R;i++)
id[i]=tmp[i],f[id[i]]=max(f[id[i]],f[id[i]-]);
};
dd S;
int main()
{
//freopen("t1.in","r",stdin);
scanf("%d%lf",&n,&S);
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf",&A[i],&B[i],&r[i]);
K[i]=-B[i]/A[i];id[i]=i;
}
f[]=S,X[]=S/(A[]*r[]+B[]),Y[]=X[]*r[];
sort(id+,id+n+,cmp1);
CDQ(,n+);
dd ans=;
for(int i=;i<=n;i++)
ans=max(ans,f[i]);
printf("%.3lf\n",ans);
return ;
}

最新文章

  1. 解决JqueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug
  2. MySQL 5.7 mysqlpump 备份工具说明
  3. 拨打电话tel: 跳转到邮件mailto:(html)
  4. java.lang.ClassNotFoundException: net.sf.json.JSONArray,java.lang.NoClassDefFoundError: net/sf/json/JSONArray jetty跑项目遇到的问题
  5. poj 1008:Maya Calendar(模拟题,玛雅日历转换)
  6. redis虚拟机模拟集群,节点,增加多端口命令
  7. 读&lt;jQuery 权威指南&gt;[6]--实用工具函数
  8. (整理)SQLServer_DBA 工具
  9. MFC 进度条控件
  10. javascript高级编程笔记03(正则表达式)
  11. MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别
  12. php的错误和异常处理
  13. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
  14. VUE浏览器储存封装
  15. 【技术与商业案例解读笔记】095:Google大数据三驾马车笔记
  16. 0006-20180422-自动化第七章-python基础学习笔记
  17. ios10兼容问题
  18. nohup后台执行
  19. C++ socket 传输不同类型数据的四种方式
  20. vue 2.x之组件的数据传递(一)

热门文章

  1. WEBGL学习【十四】利用HUD技术在网页上方显示三维物体
  2. MAVEN 构建包的引用
  3. ROPI下载安装
  4. ORA-12560: TNS: 协议适配器错误(oracle service 已启动)
  5. Mysql学习总结(37)——Mysql Limit 分页查询优化
  6. mysql在windows下主从同步配置
  7. BA-传感器
  8. 常用的Linux 命令
  9. Effective JavaScript Item 22 使用arguments来创建接受可变參数列表的函数
  10. VIM7.4 编译安装 开启python