[bzoj1492][NOI2007]Cash[CDQ分治;dp;斜率优化]
首先,设f[x]表示x天能获得的A券最大值,有动规方程:
$f[i]=max\{f[j]*A[i]+f[j]*B[i]/R[j]\}*R[i]/(R[i]*A[i]+B[i])$,
设 $j<k$ ,$f[j]>f[k]$
$\Rightarrow (f[j]/R[j]-f[k]/R[k])/(f[j]-f[k]) \leftarrow A[i]/B[i]$
令$g[i]=f[i]/R[i]$,则有$(g[j]-g[k])/(f[j]-f[k]) \leftarrow A[i]/B[i]$
将每一天描述为一个点$(f[i],g[i])$可以在一个上凸壳上进行二分进行斜率优化。
CDQ分治中按f[x]排序,分治时按id分割,这样用一个凸壳从左向右扫一遍,就可以更新整个区间的答案。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime> using namespace std; struct node
{
double x,y,A,B,R,k; int pos;
bool operator<(const node temp)const { return k>temp.k; }
}c[],temp[]; int n,head,tail,H[];
double f[]; const double eps=1e-; double Calc(const int x,const int y)
{
if(fabs(c[x].x-c[y].x)<eps)return 1e100;
return (c[x].y-c[y].y)/(c[x].x-c[y].x);
} void CDQ(const int l,const int r)
{
if(l==r)
{
f[l]=max(f[l],f[l-]);
c[l].y=f[l]/(c[l].R*c[l].A+c[l].B);c[l].x=c[l].y*c[l].R;
return ;
} int i,mid=l+((r-l)>>); int l1=l,l2=mid+;
for(i=l;i<=r;++i)
{
if(c[i].pos<=mid)temp[l1++]=c[i];
else temp[l2++]=c[i];
}
for(i=l;i<=r;++i)c[i]=temp[i]; CDQ(l,mid); tail=,head=;
for(i=l;i<=mid;++i)
{
while(tail> && Calc(H[tail-],H[tail])<Calc(H[tail],i))tail--;
H[++tail]=i;
}
for(i=mid+;i<=r;++i)
{
while(head<tail && Calc(H[head],H[head+])>c[i].k)head++;
f[c[i].pos]=max(f[c[i].pos],c[H[head]].x*c[i].A+c[H[head]].y*c[i].B);
} CDQ(mid+,r); l1=l;l2=mid+;
for(i=l;i<=r;++i)
{
if((c[l1].x<c[l2].x || (fabs(c[l1].x-c[l2].x)<eps && c[l1].y<c[l2].y+eps) || l2>r) && l1<=mid)
temp[i]=c[l1++];
else
temp[i]=c[l2++];
}
for(i=l;i<=r;++i)c[i]=temp[i];
return ;
} int main()
{
scanf("%d%lf",&n,&f[]);
for(int i=;i<=n;++i)
{
scanf("%lf%lf%lf",&c[i].A,&c[i].B,&c[i].R);
c[i].k=-c[i].A/c[i].B;c[i].pos=i;
} sort(c+,c+n+); CDQ(,n); printf("%.3f\n",f[n]); return ;
}
[bzoj1492][NOI2007]Cash[CDQ分治;dp;斜率优化]的更多相关文章
- [NOI2007]货币兑换 cdq分治,斜率优化
[NOI2007]货币兑换 LG传送门 妥妥的\(n \log n\)cdq做法. 这题用cdq分治也可以\(n \log n\)但是在洛谷上竟然比一些优秀的splay跑得慢真是见了鬼了看来还是人丑常 ...
- BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- Codeforces Gym 101175F - Machine Works(CDQ 分治维护斜率优化)
题面传送门 首先很明显我们会按照 \(d_i\) 的顺序从小到大买这些机器,故不管三七二十一先将所有机器按 \(d_i\) 从小到大排序. 考虑 \(dp\),\(dp_i\) 表示在时刻 \(d_i ...
- [NOI2007]货币兑换 「CDQ分治实现斜率优化」
首先每次买卖一定是在某天 $k$ 以当时的最大收入买入,再到第 $i$ 天卖出,那么易得方程: $$f_i = \max \{\frac{A_iRate_kf_k}{A_kRate_k + B_k} ...
- LOJ 2353 & 洛谷 P4027 [NOI2007]货币兑换(CDQ 分治维护斜率优化)
题目传送门 纪念一下第一道(?)自己 yy 出来的 NOI 题. 考虑 dp,\(dp[i]\) 表示到第 \(i\) 天最多有多少钱. 那么有 \(dp[i]=\max\{\max\limits_{ ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- 【BZOJ-4518】征途 DP + 斜率优化
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 230 Solved: 156[Submit][Status][ ...
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 705 Solved: 404[Submit][Status][Discuss ...
- 【BZOJ-1010】玩具装箱toy DP + 斜率优化
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8432 Solved: 3338[Submit][St ...
随机推荐
- HTML 5语义元素
- [读书笔记1]《C语言嵌入式系统编程修炼》
大学前两年一直搞的是单片机,写的是嵌入式C语言程序,走过了不少弯路,现在感觉仍然在走弯路.有幸偶尔看到了这篇文章,深感自己以前写程序的时候存在很多误区.现写篇博客做下总结. 作者:宋宝华出处:天极 ...
- 超实用的jQuery代码片段
1.jQuery回到顶部效果 HTML代码:<a href="javascript:;" id="btn" title="回到顶部"& ...
- 无法连接到已配置的web服务器
问题:如题,asp.net WebForm的项目,在vs中选择aspx文件在浏览器中查看时候回报该错误. 网上最多的解决方案是防火墙的原因,说关闭防火墙就可以了.但问题是我另一个项目没有问题啊,所以不 ...
- 6.12---bug
- centos源码编译安装nginx过程记录
前言:Centos系统编译安装LNMP环境是每来一台新服务器或换电脑都需要做的事情.这里仅做一个记录.给初学者一个参考! 一.安装前的环境 这里用的是centos 7系统. 我们默认把下载的软件放在 ...
- Laravel5.1学习笔记21 EloquentORM 集合
Eloquent: Collections Introduction Available Methods Custom Collections Introduction All multi-resul ...
- 01-Entity FrameWork如何控制数据的变化
在Entity Framework所有操作数据就是更新EF容器中的实体状态 public enum EntityState { Added = , Deleted = , Detached = , M ...
- BPI-M1P(全志A20)刷Android启动卡之后启动的过程
http://blog.csdn.net/wb4916/article/details/78031511BPI-M1P(全志A20)刷Android启动卡之后启动的过程 BPI-M1P(全志A20)刷 ...
- [算法天天练] - C语言实现双向链表(一)
双向链表是比较常见的,主要是在链表的基础上添加prev指针,闲话少说直接上代码吧(这个也是网上一个大神的思路,真心不错,条理清楚,逻辑缜密) 主要也是为了学习,贴上我所调试成功的代码(Linux环境下 ...