传送门

解题思路

题目里有两句提示一定要看清楚,要不全买要不全卖,所以dp方程就比较好列,f[i]=max(f[j]*rate[j]*a[i])/(rate[j]*a[j]+b[j])+(f[j]*b[i])/(rate[j]*a[j]+b[j]),意义就是在从前面的某一天买入,这一天卖出,时间复杂度O(n^2),这样只有60分,,考虑优化。设在j这天a买入了x[j]股,则x[j]=(rate[j]*f[j])/(rate[j]*a[j]+b[j]),b买入了y[j]股,则y[j]=rate[j]/(rata[j]*a[j]+b[j]),那么转移方程就可以写成f[i]=x[j]*a[i]+y[j]*b[i],那么变形之后y[j]=x[j]*(a[i]/b[i])+f[i]/b[i],这不正是y=kx+b的形式,现在要求的就是用一个a[i]/b[i]斜率的直线去过x[j],y[j]这些点,使得截距最大,这正是斜率优化。但是发现这个东西只有f具有单调性,不能用单调数据结构维护,看了大佬们的博客发现可以用cdq维护。首先维护的一定是一个斜率递减的凸包,因为斜率一定为负。其次对于一条a[i]/b[i]来说,如果当前点与上一个点的斜率更小,那么向右移动可以使得截距更大,这样就可以用cdq来维护,首先按照k排序,然后cdq分治里x这一维,就可以很玄学的转移了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm> using namespace std;
const int MAXN = ;
const double inf = 1e9;
const double eps = 1e-; int n,stk[MAXN];
double f[MAXN]; struct Query{
int id;
double x,y,k,a,b,rate;
}q[MAXN],tmp[MAXN]; inline bool cmp(Query A,Query B){
return A.k<B.k;
} inline double slope(int A,int B){
if(q[A].x==q[B].x) return inf;
return (q[A].y-q[B].y)/(q[A].x-q[B].x);
} void cdq(int l,int r){
if(l==r){
f[l]=max(f[l],f[l-]);
q[l].y=f[l]/(q[l].rate*q[l].a+q[l].b);
q[l].x=q[l].y*q[l].rate;
return;
}
int mid=l+r>>;int t1=l-,t2=mid,top=;
for(register int i=l;i<=r;i++) {
if(q[i].id<=mid) tmp[++t1]=q[i];
else tmp[++t2]=q[i];
}
for(register int i=l;i<=r;i++) q[i]=tmp[i];
cdq(l,mid);
for(register int i=l;i<=mid;i++){
while(top>= && slope(stk[top-],stk[top])<=slope(stk[top],i)+eps) top--;
stk[++top]=i;
}
for(register int i=mid+;i<=r;i++){
while(top>= && slope(stk[top-],stk[top])<=q[i].k+eps) top--;
int j=stk[top];
f[q[i].id]=max(f[q[i].id],q[j].x*q[i].a+q[j].y*q[i].b);
}
cdq(mid+,r);
int L=l,R=mid+,o=;
while(L<=mid && R<=r){
if(q[L].x<q[R].x+eps) tmp[++o]=q[L++];
else tmp[++o]=q[R++];
}
while(L<=mid) tmp[++o]=q[L++];
while(R<=r) tmp[++o]=q[R++];
for(register int i=l;i<=r;i++) q[i]=tmp[i-l+];
} int main(){
scanf("%d%lf",&n,&f[]);
for(int i=;i<=n;i++) {
scanf("%lf%lf%lf",&q[i].a,&q[i].b,&q[i].rate);
q[i].k=-q[i].a/q[i].b;q[i].id=i;
}
sort(q+,q++n,cmp);cdq(,n);
printf("%.3lf",f[n]);
return ;
}

LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)的更多相关文章

  1. bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)

    设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...

  2. BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治

    BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...

  3. [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5838  Solved: 2345[Submit][Sta ...

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

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

  5. BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)

    BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...

  6. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Sta ...

  7. [Noi2014]购票 BZOJ3672 点分治+斜率优化+CDQ分治

    Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...

  8. 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)

    LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...

  9. BZOJ3963 WF2011MachineWorks(动态规划+斜率优化+cdq分治)

    按卖出时间排序后,设f[i]为买下第i台机器后的当前最大收益,则显然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,应设为-inf以表示无法购买第i台机器. ...

随机推荐

  1. 全面解析HTML5优缺点

    HTML5是当下最主流的网页标准,它的出现给在线应用和手机游戏开发者带来了不少新机会.基于HTML5,开发者可以制作自己的网络游戏,而这个游戏无 论你在PC.手机还是平板电脑上,无论你用Chrome. ...

  2. python调用tushare获取沪股通、深股通成份股数据

    接口:hs_const 描述:获取沪股通.深股通成分数据 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 名称      |      类型      |      必选      ...

  3. Red and Black 模板题 /// BFS oj22063

    题目大意: Description There is a rectangular room, covered with square tiles. Each tile is colored eithe ...

  4. [转]C# Eval在asp.net中的用法及作用

    原文链接:http://www.cnblogs.com/Mr_JinRui/archive/2010/07/06/1772129.html Eval( " ")和Bind( &qu ...

  5. innodb_file_per_table 理解

    MYSQL innodb存储引擎 默认将所有的数据库 innodb 引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候, ibdata1文件不会自动收缩,单个数据库的备份也会成为问题 ...

  6. sql (5) 左右连接

    左连接 SQL LEFT JOIN LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行.语法SELECT colu ...

  7. 如何使用webpack 打包图片

    最近在学习vue,需要用到webpack打包css,在webpack中文网https://www.webpackjs.com/里只有css的打包配置, 在编写css样式时,因为要引入 背景图片,打包时 ...

  8. Altera的primary register和secondary register

    在Altera的一些IP文档上,提到IP的资源使用情况时,会有primary logic register和secondary logic register这样的术语. 那么什么是primary/se ...

  9. [JZOJ4665] 【GDOI2017模拟7.21】数列

    题目 题目大意 给你一个数列,让你找到一个最长的连续子序列,满足在添加了至多KKK个数之后,能够变成一条公差为DDD的等差数列. 思考历程 一眼看上去似乎是一道神题-- 没有怎么花时间思考,毕竟时间都 ...

  10. spring整合Quartz框架过程,大家可以参考下

    这篇文章详细介绍了spring集成quartz框架流程,通过示例代码进行了详细说明,对学习或任务有参考学习价值,并可供需要的朋友参考. 1.quartz框架简介(m.0831jl.com) quart ...