BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]
当然了WF的题uva hdu上也有
你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益。
可以租借的机器有M台。每台机器有四个参数D,P,R,G。你可以在第D天花费P的费用(当然,前提是你有至少P元)租借这台机器,从第D+1天起,操作机器将为你产生每天G的收益。在你不再需要机器时,可以将机器卖掉,一次性获得R的收益。
厂房里只能停留一台机器。
不能在购买和卖出机器的那天操作机器,但是可以在同一天卖掉一台机器再买入一台。
在第N+1天,你必须卖掉手上的机器。
求第N+1天后能获得的最大资金。
$DP-naive$相当好写
$f[i]$为第$i$天卖掉后最大收益
$f[i]=max{f[i-1],f[j]-P_j+R_j+G_j*(D_i-D_j-1)}$
然后变成点斜式
$f_i=A_j+G_j*D_i$
$A_j=-D_i*G_j+f_i$
$(G_j,A_j)$是点,斜率$D_i$正好按时间排序后单调(也就是说本题时间和斜率是一个东西,不用像$cash$那样按斜率排序然后分治里要先按时间分成两块)
然后$CDQ$分治维护上凸壳就行啦
从fuxey那里学到可以用计算几何那一套来避免精度问题,太棒啦!
然后我花了两节课调试修改,主要是因为:
本题的$y$需要加上$f$啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我一开始不考虑$f$结果狂$WA$,然后发现$fuxey$求凸包额外排序了才想到应该加上$f$
但是复杂度加一个$log$好别扭啊
于是我把$f$放到归并的比较里,又狂$WA$
然后发现$f$的下标需要用按时间排序后的下标,又去保存了一个$id$........
还有一点,要保证$f[j]>P_j$才能买
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e5+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
struct Vector{
ll x,y;
Vector(ll a=,ll b=):x(a),y(b){}
};
Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
typedef Vector Point;
double Cross(Vector a,Vector b){return (double)a.x*b.y-(double)a.y*b.x;} int n,D;
struct Machine{
int d,p,r,g;
ll x,y;
int id;
void ini(){
d=read();p=read();r=read();g=read();
x=g;y=-p+r-(ll)d*g-g;
}
}a[N],t[N]; inline bool cmpDay(const Machine &a,const Machine &b){return a.d<b.d;}
ll f[N];
inline bool cmp(int i,int j){return a[i].x==a[j].x ? a[i].y+f[a[i].id]<a[j].y+f[a[j].id] : a[i].x<a[j].x;}
Point p[N],ch[N];
inline ll line(ll k,Point &p){return k*p.x+p.y;}
void CDQ(int l,int r){
if(l==r){f[l]=max(f[l],f[l-]);return;}
int mid=(l+r)>>;
CDQ(l,mid);
int n=,m=;
for(int i=l;i<=mid;i++) if(f[a[i].id]>=a[i].p) //!!!!!
p[++n]=Point(a[i].x,a[i].y+f[a[i].id]);
for(int i=;i<=n;i++){
while(m>&&Cross(ch[m]-ch[m-],p[i]-ch[m-])>=) m--;
ch[++m]=p[i];
}
int j=;
for(int i=mid+;i<=r;i++){
while(j<m&&line(a[i].d,ch[j+])>=line(a[i].d,ch[j])) j++;
if(j<=m) f[i]=max(f[i],line(a[i].d,ch[j]));
}
CDQ(mid+,r); int p1=l,p2=mid+;
for(int i=l;i<=r;i++){
if(p2>r||(p1<=mid&&cmp(p1,p2))) t[i]=a[p1++];
else t[i]=a[p2++];
}
for(int i=l;i<=r;i++) a[i]=t[i];
}
int main(){
freopen("in","r",stdin);
int cas=;
while(scanf("%d%lld%d",&n,&f[],&D)!=EOF){
if(n==&&f[]==&&D==) break;
for(int i=;i<=n;i++) a[i].ini();
a[++n].d=D+;
sort(a+,a++n,cmpDay);
for(int i=;i<=n;i++) a[i].id=i,f[i]=;
CDQ(,n);
printf("Case %d: %lld\n",++cas,f[n]);
}
}
BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]的更多相关文章
- bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
3963: [WF2011]MachineWorks Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 270 Solved: 80[Submit][S ...
- BZOJ 3963 HDU3842 [WF2011]MachineWorks cdq分治 斜率优化 dp
http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两 ...
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp
题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...
- BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)
BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ...
- bzoj3672/luogu2305 购票 (运用点分治思想的树上cdq分治+斜率优化dp)
我们都做过一道题(?)货币兑换,是用cdq分治来解决不单调的斜率优化 现在它放到了树上.. 总之先写下来dp方程,$f[i]=min\{f[j]+(dis[i]-dis[j])*p[i]+q[i]\} ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
随机推荐
- callback和spring的MD5加密
举个例子:当我们访问淘宝网站的时候,当点击购物车的时候,这个时候提示用户登录用户名和密码,登录成功后,会返回到购物车的页面.这就是回调. 它不返回淘宝的首页,而是返回到我们点击的内容所在页面. 在写接 ...
- 一 : springmvc常用注解
springmvc常用注解详解1.@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层 ...
- github设置添加SSH
很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用 ...
- LAMP和LNMP,你更愿意选择谁,为什么?
https://www.zhihu.com/question/19697826 http://www.simongong.net lamp 的全称是linux + apache + mysql +ph ...
- PostgreSql问题:ERROR: operator does not exist: timestamp without time zone > character varying
问题描述: ERROR: operator does not exist: timestamp without time zone > character varying 解决方法: //注意 ...
- 源码讲解 node+mongodb 建站攻略(一期)第二节
源码讲解 node+mongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb. 代码http://www.imlwj.com/download/n ...
- CCF系列之数列分段(201509-1)
试题名称: 数列分段 试题编号: 201509-1 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 ...
- properties文件中中文不能显示或者中文乱码
1.properties 文件中文乱码问题 鼠标“右击”文件 => Resource => Text file encoding => UTF-8 2.properties 文件解析 ...
- 【笔记】css 实现宽度自适应屏幕 高度自适应宽度
如果说宽高自适应屏幕尺寸那么大家可能会想到 div{ width: 100%; height: 100% } 但是如果我要自适应屏幕尺寸的同时还要变成正方形呢?(高度和宽度相等而高度不能写死) 那就要 ...
- 解决 PHPExcel 长数字串显示为科学计数[转]
解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...