bzoj1492 NOI2007 货币兑换Cash
题目描述
题解:
题目都提示了,
很明显要导一波式子:
$$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相关推荐
- bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...
- [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MB Submit: 5907 Solved: 2377 [Submit][S ...
- bzoj1492: [NOI2007]货币兑换Cash
码了我两个星期的题啊,终于写完了,感觉一半的时间都在调splay,后面写cdq好像轻松一点,cdq码量小一倍,而且又好想(可能是我调的时候理解了)感觉这种黑科技很nb,关键是可以减少细节出错(像我这种 ...
- BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- bzoj1492 [NOI2007]货币兑换Cash (斜率DP+cdq分治)
题意:到处都找得到. 我没看错的话当年考试的时候的题面里头,是提示了买卖一定是全部买入和卖出的.这样一来就好办了.cdq的论文里面那个F并不是她所说的那样,而是就是那个最优值.方程转移的时候实际上是枚 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- 【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 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...
最新文章
- Spring Boot+JWT+Shiro+MyBatisPlus实现Restful快速开发后端脚手架
- 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍
- AI科研绘图1:零基础入门和基本图形绘制
- squid服务器的代理
- 用泰勒公式算sin cos用c语言,用泰勒公式求sin(x)的近似值
- 计算图上的微积分:Backpropagation 微积分 SOTON数据分析 · 2015-09-06 08:52 [译] 计算图上的微积分:Backpropagation 引言 Backprop
- django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
- CnetOS中开关网络服务
- 【虚拟化】docker创建mysql镜像,docker内部操作mysql
- 吉林建筑大学电气与计算机学院院长,吉林建筑大学电气与计算机学院研究生导师:张玉红...
- GoldWave的消音、淡入淡出、改变音乐速率
- Docker CE 安装教程
- gsp计算机设施设备表格,GSP计算机系统内审表.doc
- redis与数据库同步的解决方案
- [luoguP3627][APIO2009]抢掠计划
- PS不改变图片分辨率条件下改变照片kb大小
- python动力学建模与仿真_发动机悬置python仿真计算
- The file contains a character that cannot be represented in the current code page.c1070
- m在ISE平台下使用verilog开发基于FPGA的GMSK调制器
- fiddler 抓取手机上点击微信公众号的链接