BZOJ1492: [NOI2007]货币兑换Cash
设$x_j$,$y_j$为第$j$天能买的A,B券数量,$f_i$为第$i$天的最大收益。$f_i=\max_{1\le j<i}a_ix_j+b_iy_j$,最大化$f_i$即找一个点$(x_j,y_j)$,使得这个点和斜率$-a_i/b_i$所确定的直线截距最大。平衡树维护凸包即可,按$x$建平衡树,并维护斜率单调递减,判断删点时用叉积比较优越。比一般的CDQ还快,可能是因为凸包的点数不多,所以平衡树的log就比较小。另外就是不加eps理论上也没有问题。
#include<cstdio>
#include<cstdlib>
typedef double real;
const int N=1e5+5;
typedef struct node*ptr;
struct node{
ptr i,j,s,t;real w,x,y;
node(){w=rand();}
}*b,e[N];
void zag(ptr&x){ptr y=x->j;x->j=y->i,y->i=x,x=y;}
void zig(ptr&x){ptr y=x->i;x->i=y->j,y->j=x,x=y;}
void ins(ptr y,ptr&x=b){
if(!x)x=y,x->s?x->s->t=x:0,x->t?x->t->s=x:0;
else if(y->x>x->x)
{ins(y,x->j);if(x->j->w>x->w)zag(x);}
else
{ins(y,x->i);if(x->i->w>x->w)zig(x);}
}
void del(ptr y,ptr&x=b){
if(y->x>x->x)del(y,x->j);
else if(x->x>y->x)del(y,x->i);
else if(!x->i)x=x->j;
else if(!x->j)x=x->i;
else if(x->i->w>x->j->w)zig(x),del(y,x->j);
else zag(x),del(y,x->i);
}
ptr pre(real k,ptr x=b){
ptr y=0;
while(x)k>=x->x?y=x,x=x->j:x=x->i;
return y;
}
ptr suc(real k,ptr x=b){
ptr y=0;
while(x)x->x>=k?y=x,x=x->i:x=x->j;
return y;
}
real slo(ptr s,ptr t){return(s->y-t->y)/(s->x-t->x);}
real cal(ptr x,ptr s,ptr t){
real x1=x->x-s->x,x2=t->x-s->x;
real y1=x->y-s->y,y2=t->y-s->y;
return x1*y2-x2*y1;
}
void upd(ptr x){
if(ptr&y=x->s=pre(x->x))
while(y->s&&cal(x,y->s,y)<=0)
del(y),y=pre(x->x);
if(ptr&y=x->t=suc(x->x))
while(y->t&&cal(x,y,y->t)<=0)
del(y),y=suc(x->x);
if(!x->s||!x->t||cal(x->t,x->s,x)>0)
ins(x);
}
void eq2(real&x,real y){x=x<y?y:x;}
real s,t,r,f;
void sol(real k,ptr x=b){
if(x->s&&k>slo(x->s,x))sol(k,x->i);
else if(x->t&&slo(x,x->t)>k)sol(k,x->j);
else eq2(f,s*x->x+t*x->y);
}
int main(){
int n;
scanf("%d%lf",&n,&f);
for(int i=1;i<=n;++i){
scanf("%lf%lf%lf",&s,&t,&r);
if(i>1)sol(-s/t);
e[i].x=r*(e[i].y=f/(r*s+t));
upd(e+i);
}
printf("%.3f\n",f);
}
BZOJ1492: [NOI2007]货币兑换Cash的更多相关文章
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ...
- bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...
- BZOJ1492: [NOI2007]货币兑换Cash 【dp + CDQ分治】
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5391 Solved: 2181 [Submit][S ...
- [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5907 Solved: 2377[Submit][Sta ...
- Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)
题面 传送门 Sol 题目都说了 必然存在一种最优的买卖方案满足: 每次买进操作使用完所有的人民币: 每次卖出操作卖出所有的金券. 设\(f[i]\)表示第\(i\)天可以有的最大钱数 枚举\(j&l ...
- bzoj1492 [NOI2007]货币兑换Cash【cdq分治】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1492 推荐博客:http://www.cnblogs.com/zig-zag/archive ...
- cdq分治入门--BZOJ1492: [NOI2007]货币兑换Cash
n<=100000天,一开始有s块钱,每天股票A价格ai,B价格bi,每天可以做的事情:卖出股票:按A:B=RTi的比例买入股票.问最后的最大收益.股票可以为浮点数,答案保留三位. 用脚指头想想 ...
随机推荐
- 一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)
单机部署(stand-alone):只有一个饮水机提供服务,服务只部署一份 集群部署(cluster):有多个饮水机同时提供服务,服务冗余部署,每个冗余的服务都对外提供服务,一个服务挂掉时依然可用 热 ...
- JDBC数据库访问操作的动态监测 之 Log4JDBC
log4jdbc是一个JDBC驱动器,能够记录SQL日志和SQL执行时间等信息.log4jdbc使用SLF4J(Simple Logging Facade)作为日志系统. 特性: 1.支持JDBC3和 ...
- Google C++单元测试框架GoogleTest---Google Mock简介--概念及基础语法
就在昨天终于做了gtest的分享,我的预研工作终于结束了,感觉离我辞职的日子不远了,毕竟是专注java二百年啊,要告别实习啦.. 这篇是GoogleMock的简介文档,会在后边附带一个自己的例子. 一 ...
- Genymotion报Unable to load virtualbox engine错误
- 了解JavaScript 面向对象基础 & 原型与对象
面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...
- 旅游公司招聘Java工程师
公司招聘:岗位要求如下 Java开发工程师工作内容1.根据需求完成软件系统代码的开发,测试以及文档撰写工作:2.分析并解决客户的问题:3.配合业务部门进行数据分析以及系统优化 岗位要求:1.本科以上学 ...
- 原创 C++之常量(二)
4常量的内存分配 4.1应用程序的内存结构 一个由C++编译的应用程序,占用的内存可以划分为如下几个部分: 栈(stack).由编译器自动分配释放.存放函数参数和函数里的局部变量(又称自动变量).其操 ...
- MySQL 博客文章目录(2016-08-20更新)
1 MySQL安装配置 Linux MySQL源码安装缺少ncurses-devel包 Linux平台卸载MySQL总结 Linux 卸载mysql-libs包出现错误 2 MySQL管理配置 My ...
- 解决Ubuntu下Firefox+OpenJDK没有Java插件的问题
如果是安装的OpenJDK,很遗憾它是没有libnpjp2.so的. 此时按照网上各种奇怪的方法都挣扎无效,但可以用icedtea插件来解决这个问题. icedtea的版本与本机安装的OpenJDK版 ...
- 卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别
由于公司需要进行了中文验证码的图片识别开发,最近一段时间刚忙完上线,好不容易闲下来就继上篇<基于Windows10 x64+visual Studio2013+Python2.7.12环境下的C ...