题目描述

题解:

题目都提示了,

很明显要导一波式子:

$$dp[i]=max( dp[i-1] , \frac{ dp[j] } { A[j]*R[j]+B[j] } * (A[i]*R[j]+B[i]))$$

后面那个东西相当与将第j天的R[j]个A和1个B绑在一起。

$dp[i-1]$没什么好说的,关键是后面那个。

看起来还可以提一下。

$$dp[i]=\frac{dp[j]}{A[j]*R[j]+B[j]}*(A[i]*R[j]+B[i])$$

把右面$A[i]$移项:

$$\frac{dp[i]}{A[i]}=\frac{dp[j]*R[j]}{A[j]*R[j]+B[j]}+\frac{B[i]}{A[i]}*\frac{dp[j]}{A[j]*R[j]+B[j]}$$

再移一下:

$$\frac{dp[j]*R[j]}{A[j]*R[j]+B[j]}=-\frac{B[i]}{A[i]}*\frac{dp[j]}{A[j]*R[j]+B[j]}+\frac{dp[i]}{A[i]}$$

现在让$b$项最大,维护斜率递减的上凸包。

但是x没有单调性啊……

于是就有两种处理方法。

第一种是$splay$在线强插,比较恶心;

第二种是$cdq$离线处理,非常好写。

由于我们要尽可能优化时间,可以考虑每次更新之前让左区间的$x$有序,右区间的$k$有序。

这样的话左边$O(n)$建凸包,右边$O(n)$匹配。

但是每次都要排序啊……

我们不妨先将整个区间关于$k$排序,然后分治前按编号分好,这样可以保证右边的k一定是单调的。

这样整体就是$O(nlogn)$了。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define db double
#define N 100050
const db eps = 1e-8;
const db inf = 1e10;
int n;
db dp[N];
struct node
{db a,b,r,x,y,k;int id;
}p[N],tmp[N];
db slop(node n1,node n2)
{if(fabs(n1.x-n2.x)<=eps)return inf;return (n1.y-n2.y)/(n1.x-n2.x);
}
bool cmpid(node n1,node n2)
{return n1.id<n2.id;
}
bool cmpk(node n1,node n2)
{return n1.k<n2.k;
}
void Sort(int l,int r)//cmp x
{int mid = (l+r)>>1;int i=l,j = mid+1,k = l-1;while(i<=mid&&j<=r){while(i<=mid&&p[i].x<=p[j].x)tmp[++k]=p[i++];while(j<=r&&p[i].x>p[j].x)tmp[++k]=p[j++];}while(i<=mid)tmp[++k]=p[i++];while(j<=r)tmp[++k]=p[j++];for(i=l;i<=r;i++)p[i]=tmp[i];
}
void divi(int l,int r)
{int mid = (l+r)>>1;int i=l-1,j=mid;for(int k=l;k<=r;k++){if(p[k].id<=mid)tmp[++i]=p[k];else tmp[++j]=p[k];}for(int k=l;k<=r;k++)p[k]=tmp[k];
}
int sta[N],tl;
void cdq(int l,int r)
{if(l==r){dp[l] = max(dp[l],dp[l-1]);p[l].x = dp[l]/(p[l].a*p[l].r+p[l].b);p[l].y = p[l].x*p[l].r;return ;}int mid = (l+r)>>1;divi(l,r);cdq(l,mid);tl = 0;for(int i=l;i<=mid;i++){while(tl>=2&&slop(p[sta[tl]],p[i])+eps>slop(p[sta[tl]],p[sta[tl-1]]))tl--;sta[++tl] = i;}for(int i=mid+1;i<=r;i++){while(tl>=2&&slop(p[sta[tl]],p[sta[tl-1]])<p[i].k+eps)tl--;dp[p[i].id] = max(dp[p[i].id],p[sta[tl]].x*p[i].b+p[sta[tl]].y*p[i].a);}cdq(mid+1,r);Sort(l,r);
}
int main()
{scanf("%d%lf",&n,&dp[0]);for(int i=1;i<=n;i++){scanf("%lf%lf%lf",&p[i].a,&p[i].b,&p[i].r);p[i].k = -p[i].b/p[i].a;p[i].id = i;}sort(p+1,p+1+n,cmpk);cdq(1,n);printf("%.3lf\n",dp[n]);return 0;
}

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10193646.html

bzoj1492 NOI2007 货币兑换Cash相关推荐

  1. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...

  2. [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 5907  Solved: 2377 [Submit][S ...

  3. bzoj1492: [NOI2007]货币兑换Cash

    码了我两个星期的题啊,终于写完了,感觉一半的时间都在调splay,后面写cdq好像轻松一点,cdq码量小一倍,而且又好想(可能是我调的时候理解了)感觉这种黑科技很nb,关键是可以减少细节出错(像我这种 ...

  4. BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  5. bzoj1492 [NOI2007]货币兑换Cash (斜率DP+cdq分治)

    题意:到处都找得到. 我没看错的话当年考试的时候的题面里头,是提示了买卖一定是全部买入和卖出的.这样一来就好办了.cdq的论文里面那个F并不是她所说的那样,而是就是那个最优值.方程转移的时候实际上是枚 ...

  6. 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治

    [BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...

  7. 【bzoj 1492】【codevs 1797】 [NOI2007]货币兑换Cash (dp+cdq分治)

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 3803  Solved: 1604 [Submit][S ...

  8. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  9. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash

    Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...

最新文章

  1. Spring Boot+JWT+Shiro+MyBatisPlus实现Restful快速开发后端脚手架
  2. 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍
  3. AI科研绘图1:零基础入门和基本图形绘制
  4. squid服务器的代理
  5. 用泰勒公式算sin cos用c语言,用泰勒公式求sin(x)的近似值
  6. 计算图上的微积分:Backpropagation 微积分 SOTON数据分析 · 2015-09-06 08:52 [译] 计算图上的微积分:Backpropagation 引言 Backprop
  7. django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
  8. CnetOS中开关网络服务
  9. 【虚拟化】docker创建mysql镜像,docker内部操作mysql
  10. 吉林建筑大学电气与计算机学院院长,吉林建筑大学电气与计算机学院研究生导师:张玉红...
  11. GoldWave的消音、淡入淡出、改变音乐速率
  12. Docker CE 安装教程
  13. gsp计算机设施设备表格,GSP计算机系统内审表.doc
  14. redis与数据库同步的解决方案
  15. [luoguP3627][APIO2009]抢掠计划
  16. PS不改变图片分辨率条件下改变照片kb大小
  17. python动力学建模与仿真_发动机悬置python仿真计算
  18. The file contains a character that cannot be represented in the current code page.c1070
  19. m在ISE平台下使用verilog开发基于FPGA的GMSK调制器
  20. fiddler 抓取手机上点击微信公众号的链接

热门文章

  1. 面试了近百人,我是这样招程序员的
  2. 具备多功能的CAD快速看图软件
  3. 多因子认证是什么意思?与双因子认证有什么区别?
  4. 【字符串】DNA反向互补链
  5. 重庆自考本科报名费多少钱?总共花多少钱?
  6. 程序员都懂的30个段子,你知道几个?
  7. 产品运营|提高用户留存的方法
  8. 可逆矩阵的秩等于矩阵的阶数_可逆矩阵为什么是满秩矩阵?谢谢
  9. 末端物流自动配送车交付超1000台,毫末智行加速无人配送商业化
  10. 图片怎么在线识别转文字?常见渠道一览