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方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
随机推荐
- c++(链表逆转)
链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求.和线性逆转不一样,单向链表的节点需要一个一个进行处理.为了显示两者之间的区别,我们分别对线性内存和链表进行逆转: (1 ...
- 浅谈MySQL集群高可用架构
前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...
- BLE空中升级 谈(一)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...
- [学习OpenCV攻略][003[初试牛刀——显示图片]
cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...
- Sql Server——约束
约束是什么: 每个人都在网站或者APP上注册过账号,在注册账号时会限制用户名.密码等格式,如果格式不对就不能注册.在数据库中我们可以通过约束来进行限制,超过约束范围的数据就不能写入. 约束的种类: 主 ...
- Nginx实战之反向代理WebSocket的配置实例
http://www.jb51.net/article/112183.htm 最近在工作中遇到一个需求,需要使用 nginx 反向代理websocket,经过查找一番资料,目前已经测试通过,所以这篇文 ...
- Sublime 安装、插件CoolFormat
http://www.sublimetext.com/3 安装Package Control https://packagecontrol.io/installation#st3 安装插件Cool F ...
- Canvas DrawImage截取和压缩图片的陷阱
html5的canvas十分之强大,可以做到快速的截取压缩出新的图片! 不过最近开发过程中遇到一个问题,图片压缩后使用toDataURL取得图片显示为一片漆黑,什么都没有! 折腾了很久,起初以为是上传 ...
- DOS、Mac 和 Unix 文件格式[转]
DOS.Mac 和 Unix 文件格式 相信很多朋友都碰到过这三种文件格式的互换问题,今日又碰到这个问题,忽然想寻根问底,于是整理了本文档. 文件格式区别 我们先看看这三个家伙有啥区别.很久以前, ...
- python初识 - day4
一.集合(set) 1.集合的定义 set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置, 因此不支持索引.分片等类序列的操作. 2.集合的创建 大括号或 ...