[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 ...
随机推荐
- (数论)51NOD 1073 约瑟夫环
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号.例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号.In ...
- Django之序列化
关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1.serializers from django.core ...
- Codeforces 1131 (div 2)
链接:http://codeforces.com/contest/1131 A Sea Battle 利用良心出题人给出的图,不难看出答案为\(2*(h1+h2)+2*max(w1,w2)+4\)由于 ...
- HTML基础2——综合案例3——创建考试报名表格
<html> <head> <title></title> </head> <body> <table width=&qu ...
- LN : leetcode 53 Maximum Subarray
lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...
- leetcode464 Can I Win
思路: 博弈. 实现: class Solution { public: bool dfs(int cur, int len, int sum, int des, vector<int>& ...
- 华硕(ASUS)X554LP笔记本重装win7后网卡和USB驱动问题的解决
以前在其它笔记本上采用U盘克隆安装winxp系统非常顺利,各种硬件驱动能自动识别并安装. 手上有一台别人的华硕(ASUS)X554LP笔记本,原装win8.1,用不惯,想装个win7旗舰版. 照例去系 ...
- MERGE INTO USING用法
MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your ...
- swift 扩展 要素总结
类: 协议: 泛型及元素类型:扩展约束:
- Layui数据表单的编辑
使用layui对单元格进行编辑并保存 先是要引入layui的JS和CSS 然后创建一个表格 而重要的是edit这个属性,只有使用了这个属性的一列数据表格才可以编辑,其余的都不可以进行编辑 然后使用la ...