BZOJ3963: [WF2011]MachineWorks


Description

你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器。原来的那一台生产机器已经坏了,所以你要去为公司买一台新的生产机器。你的任务是在转型期内尽可能得到更大的收益。在这段时间内,你要买卖机器,并且当机器被ACM公司拥有的时候,操控这些机器以获取利润。因为空间的限制,ACM公司在任何时候都只能最多拥有一台机器。
在转型期内,有若干台可能卖出的机器。作为先进机器的专家,对于每台机器Mi,你已经知道了其价格Pi和可以买入的日期Di。注意,如果不在第Di天买入机器Mi,那么别的人也会买走这一台机器,也就是说,以后你将没有机会购买这台机器了。如果ACM的钱低于一台机器的价格,那么你显然不可能买到这一台机器。
如果你在第Di天买入了机器Mi,那么ACM公司可以从第(Di)+1天开始使用这一台机器。每使用这台机器一天,就可以为公司创造出Gi美元的收益。
你可以决定要在买入之后的某一天,以一定的折扣价卖出这一台机器。收购市场对于每一台机器,都有一个折扣价Ri。你不能在卖出的那一天使用机器,但是你可以在卖出的那一天再买入一台新的。
在转型期结束后,ACM公司会卖掉当前所拥有的机器。你的任务就是最大化转型期间ACM公司可以得到的收入。

Input

输入包含若干组测试用例。每一组测试用例的第一行有3个正整数N,C和D。N是将会卖出的机器的台数(N&lt;=105)(N&lt;=10^5)(N<=105),C是在转型期开始时公司拥有的美元数量(C&lt;=109)(C&lt;=10^9)(C<=109),D是转型期持续的天数(D&lt;=109)(D&lt;=10^9)(D<=109)。
之后的N行每一行描述了一台机器的情况。每一行有4个正整数Di,Pi,Ri和Gi,分别表示这台机器卖出的时间,购买这台机器需要的美元数量,卖出这台机器的折扣价和使用这台机器可以得到的利润。这些数字满足1&lt;=Di&lt;=D,1&lt;=Ri&lt;Pi&lt;=1091&lt;=Di&lt;=D,1&lt;=Ri&lt;Pi&lt;=10^91<=Di<=D,1<=Ri<Pi<=109且1&lt;=Gi&lt;=1091&lt;=Gi&lt;=10^91<=Gi<=109.
最后一组测试用例后面的一行由3个0组成,表示输入数据。

Output

对于每一组测试用例,输出测试用例的编号,之后给出ACM公司在第D+1天结束后可以得到的最大数量的美元。
请依照下面给出的样例输出。

Sample Input

6 10 20
6 12 1 3
1 9 1 2
3 2 1 2
8 20 5 4
4 11 7 4
2 10 9 1
0 0 0

Sample Output

Case 1: 44


比较裸的CDQ+斜率优化吧

直接维护就行了?雾

首先定义一下DP:dpidp_idpi​表示卖完第i台机器的最大收益,也就是卖出上一台机器的收益-pip_ipi​

然后考虑转移dpi=max(dpj+rj+(di−dj−1)∗dj)−pidp_i=max(dp_j+r_j+(d_i-d_j-1)*d_j)-p_idpi​=max(dpj​+rj​+(di​−dj​−1)∗dj​)−pi​
把中间展开dpi=dpj+rj−(dj+1)∗gj+di∗gj−pidp_i=dp_j+r_j-(d_j+1)*g_j+d_i*g_j-p_idpi​=dpj​+rj​−(dj​+1)∗gj​+di​∗gj​−pi​
然后变成点斜式dpi+pi−di∗gj=dpj+dj−(dj+1)∗gjdp_i+p_i-d_i*g_j=dp_j+d_j-(d_j+1)*g_jdpi​+pi​−di​∗gj​=dpj​+dj​−(dj​+1)∗gj​
然后我们只需要判断一下可不可行dpi&gt;pidp_i&gt;p_idpi​>pi​然后直接CDQ分治,用左边的维护凸包,然后将右边的斜率排一下序直接查找就好了

不想写归并所以就直接sort了,多个log影响不大


 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pi pair<LL,LL>
#define N 100010
#define INFF 1e16
#define INFI 0x3f3f3f3f3f3f3f3f
LL n,m,c;
LL dp[N];//买入机器i之后的最大收益
struct Machine{
LL d,p,r,g;
void init(){scanf("%lld%lld%lld%lld",&d,&p,&r,&g);}
}t[N];
struct Node{
LL x,y;
Node(){}
Node(int id){
x=t[id].g;
y=dp[id]+t[id].r-t[id].g*(t[id].d+);
}
Node(LL _x,LL _y){x=_x,y=_y;}
};
vector<Node> lq,rq;
deque<Node> q;
bool cmpMachine(Machine a,Machine b){return a.d<b.d;}
bool cmpNode(Node a,Node b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
double getk(Node a,Node b){
if(a.x==b.x)return INFF;
return (double) (a.y-b.y)/(double) (a.x-b.x);
}
void solve(int l,int r){
if(l==r){
dp[l]=max(dp[l],1ll*c);dp[l]-=t[l].p;
if(dp[l]<)dp[l]=-INFI;
return;
}
int mid=(l+r)>>;
solve(l,mid);
lq.clear();rq.clear();q.clear();
for(int i=l;i<=mid;i++)if(dp[i]!=-INFI)lq.push_back(Node(i));
for(int i=mid+;i<=r;i++)rq.push_back(Node(t[i].d,i));
sort(lq.begin(),lq.end(),cmpNode);
sort(rq.begin(),rq.end(),cmpNode);
for(int i=;i<lq.size();i++){
while(q.size()>=&&getk(lq[i],q.back())>getk(q.back(),q[q.size()-]))q.pop_back();
q.push_back(lq[i]);
}
if(q.size()){
for(int i=;i<rq.size();i++){
while(q.size()>=&&getk(q[],q[])>-rq[i].x)q.pop_front();
dp[rq[i].y]=max(dp[rq[i].y],q.front().x*rq[i].x+q.front().y);
}
}
solve(mid+,r);
}
int main(){
int T=;
while(scanf("%lld%lld%lld",&m,&c,&n)&&(n||m||c)){
for(int i=;i<=m;i++)t[i].init(),dp[i]=-INFI;
t[++m]=(Machine){n+,,,};dp[m]=-INFI;
sort(t+,t+m+,cmpMachine);
solve(,m);
printf("Case %d: %lld\n",++T,dp[m]);
}
return ;
}

BZOJ3963: [WF2011]MachineWorks 【CDQ+斜率优化DP】*的更多相关文章

  1. bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp

    3963: [WF2011]MachineWorks Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 270  Solved: 80[Submit][S ...

  2. 【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 ...

  3. 【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治

    题目描述  给出一棵以1为根的带边权有根树,对于每个根节点以外的点$v$,如果它与其某个祖先$a$的距离$d$不超过$l_v$,则可以花费$p_vd+q_v$的代价从$v$到$a$.问从每个点到1花费 ...

  4. BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)

    BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...

  5. [Noi2014]购票 斜率优化DP+可持久化凸包

    貌似网上大部分题解都是CDQ分治+点分治然后再斜率优化DP,我貌似并没有用这个方法. 这一题跟这题有点像,只不过多了一个l的限制 如果说直接跑斜率优化DP,存储整个序列的话,显然是不行的,如图所示(图 ...

  6. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  7. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  8. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  9. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

随机推荐

  1. Gtk基础学习总结(二)

    一.信号.事件 void g_signal_connect(instance,char* signalName,callback,gpointerobject); //instance:gtk控件 i ...

  2. Java字符串替换忽略大小写

    今天在做字符串替换时忽略大小写,网上找到了一个非常简便的方法,使用String的replaceAll方法. java.lang.String.replaceAll(String regex, Stri ...

  3. Java虚拟机组成详解

    导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难. Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我 ...

  4. 【nginx】一台nginx服务器多域名配置

    Nginx 多域名配置 nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里.一. ...

  5. jquery中的工具方法$.isFunction, $.isArray(), $.isWindow()

    本文正式地址:http://www.xiabingbao.com/jquery/2015/07/25/jquery-judge-type 在javascript中对变量类型的判断中,我们讲解了了jqu ...

  6. ElasticSearch + Canal 开发千万级的实时搜索系统【转】

    公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市.用户ID昵称等进行搜索. 项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式.但随着业务的发展, ...

  7. ZooKeeper原理 --------这可能是把ZooKeeper概念讲的最清楚的一篇文章

    相信大家对 ZooKeeper 应该不算陌生,但是你真的了解 ZooKeeper 是什么吗?如果别人/面试官让你讲讲 ZooKeeper 是什么,你能回答到哪个地步呢? 我本人曾经使用过 ZooKee ...

  8. 使用unity2017.3 vuforia7摄像头放大的问题

    最近项目需要用到vuforia并且运行环境是Win10,所幸vuforia7刚好出来了,特此记录下开发中遇到的坑 1.从assets store下载示例,运行找不到vuforia命名空间 很多人说的解 ...

  9. .pth 文件扩展python环境路径

    有时候我们不希望把一个库放到 site-packages 下面,而是更愿意把它保留在原始的工程目录中,方便管理和维护. 通常的做法是在程序启动的时候,往sys.path里面增加这个目录,但是这样做非常 ...

  10. lambda表达式 <二>

    概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...