●BZOJ 3963 [WF2011]MachineWorks
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3963
题解:
斜率优化DP,CDQ分治。
先按时间排序。(规定以下内容的第i台机器的卖出时间D[i]大于第i-1台机器的卖出时间D[i-1])
定义DP[i]表示在在第i台机器可以交易的那天,卖出所有机器后能够得到的最大收益,(最后答案是DP[all_day+1])
转移显然:
$DP[i]=DP[i-1]$
$DP[i]=max(DP[j]+(D_i-D_j-1)*G_j-P_j+R_j) (j<i且DP[j]>=P[j])$
令$Y_j=DP[j]-(D_j+1)*G_j-P_j+R_j$,如果存在两个转移点k,j且G[k]<G[j],假设j点优于k点
那么 $Y_j-Y_k>-D_i(G_j-G_k)$
$\quad\quad\frac{Y_j-Y_k}{G_j-G_k}>-D_i$
那么得到结论,如果 G[k]<G[j],且Slope(j,k)>-D[i]的话,则j点优于k点。
同时如果存在三个转移来源点:k,j,i,满足G[k]<G[j]<G[i],
同时Slope(i,j)>Slope(j,k),则j点无效。
所以对于每个来源点二元组(G[j],Y[j]),只需要在平面上维护一个上凸壳即可。
但是G不单调,所以用CDQ分治。
对于分治的每一层l~r,先递归处理左边l~mid,然后把左边按G从小到大排序,并维护好上凸壳。
由于D单调递增,所以遍历一边凸壳以及右边mid+1~r进行贡献就好。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100050
#define ll long long
using namespace std;
ll Y[MAXN],G[MAXN],D[MAXN],P[MAXN],R[MAXN],DP[MAXN];
int h[MAXN],N,C,T,S;
bool cmp(int i,int j){
return D[i]<D[j];
}
struct Moque{
int q[MAXN],l,r;
#define Slope(i,j) (1.0*(Y[i]-Y[j])/(G[i]-G[j]))
void Reset(){l=1; r=0;}
void Push(int i){
if(l<=r&&G[i]==G[q[r]])
{if(Y[i]>Y[q[r]]) r--; else return;}
while(l+1<=r&&Slope(i,q[r])>Slope(q[r],q[r-1])) r--;
q[++r]=i;
}
int Query(int i){
while(l+1<=r&&Slope(q[l+1],q[l])>-D[i]) l++;
return q[l];
}
}Q;
void solve(int l,int r){
static int tmp[MAXN],cl,cr,p; static ll MAXDP;
if(l==r) return (void)(Y[h[l]]=DP[h[l]]-(D[h[l]]+1)*G[h[l]]-P[h[l]]+R[h[l]]);
int mid=(l+r)>>1;
solve(l,mid);//之后,左边G单调
Q.Reset(); MAXDP=0;
for(int i=l;i<=mid;i++){
MAXDP=max(MAXDP,DP[h[i]]);
if(DP[h[i]]>=P[h[i]]) Q.Push(h[i]);//上凸壳斜率单减
}
//Di单增,-Di单减,正序枚举就好。
for(int i=mid+1,j;i<=r;i++){
j=Q.Query(h[i]);
DP[h[i]]=max(DP[h[i]],MAXDP);
DP[h[i]]=max(DP[h[i]],DP[j]+(D[h[i]]-D[j]-1)*G[j]-P[j]+R[j]);
}
solve(mid+1,r);
cl=l; cr=mid+1; p=l;
while(cl<=mid||cr<=r){
if(cl>mid) tmp[p]=h[cr],cr++;
else if(cr>r||G[h[cl]]<G[h[cr]]) tmp[p]=h[cl],cl++;
else tmp[p]=h[cr],cr++; p++;
}
for(int i=l;i<=r;i++) h[i]=tmp[i];
}
int main(){
int Cas=0;
while(1){
memset(DP,0,sizeof(DP));
scanf("%d%d%d",&N,&S,&T);
if(N==0&&DP[1]==0&&T==0) break;
memset(Y,0,sizeof(Y));
for(int i=1,a,b,c,d;i<=N;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
h[i]=i; D[i]=a; P[i]=b; R[i]=c; G[i]=d;
}
N++; D[N]=T+1; h[N]=N;
sort(h+1,h+N+1,cmp);
DP[h[1]]=S; solve(1,N);
printf("Case %d: %lld\n",++Cas,DP[N]);
}
return 0;
}
●BZOJ 3963 [WF2011]MachineWorks的更多相关文章
- HDU 3824/ BZOJ 3963 [WF2011]MachineWorks (斜率优化DP+CDQ分治维护凸包)
题面 BZOJ传送门(中文题面但是权限题) HDU传送门(英文题面) 分析 定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[ ...
- BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]
传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...
- BZOJ 3963: [WF2011]MachineWorks 斜率优化 + splay动态维护凸包
Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以 ...
- 【BZOJ】3963: [WF2011]MachineWorks
[题意]给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器.给定初始钱数c和总天数T,求最大收益.n<=10^5 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
3963: [WF2011]MachineWorks Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 270 Solved: 80[Submit][S ...
- BZOJ3963: [WF2011]MachineWorks 【CDQ+斜率优化DP】*
BZOJ3963: [WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- BZOJ 3963 HDU3842 [WF2011]MachineWorks cdq分治 斜率优化 dp
http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两 ...
随机推荐
- 团队作业7-Beta版本冲刺计划及安排
a.下一阶段需要改进完善的功能 对部分bug的修改,主要是在未登录时页面跳转的问题以及防止通过对数据库进行注入查询. b.下一阶段新增的功能 1.活动页面,提示打折信息等. 2.商家修改打折信息 3. ...
- 简单的C语言编译器--语义制导翻译
语法分析是最难写的,而这部分确实最伤脑的.大量的语义动作分析差点把我逼疯. 简而言之,这部分的作用就是在每次归约之后,都进行一些语义动作,最终让我们得到测试程序的三地址码,即中间代码. 1. ...
- Django 模版语法
一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. {% extends "base ...
- 接触JS的变量
刚刚接触到js,写的代码都是很简单的,制单的概念也相当少,新学习的就是变量.let和const以及js的数据类型. 变量的内容有五个,我就不一一介绍了,重点在于: 在 JavaScript 中,使用变 ...
- kali使用
1.kali安装后安装vmtools ①.vim /etc/apt/sources.list 添加中科大滚动版更新源 deb http://mirrors.ustc.edu.cn/kali kali- ...
- CentOS 7 GUI图形界面安装
在此之前先获取root权限,进行以下命令: 1. 在命令行下输入下面的命令来安装Gnome包: yum groupinstall "GNOME Desktop" "Gra ...
- 剑指offer-数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...
- AssemblyExecuteAdapter
BizTalk custom adapter AssemblyExecuteAdapter 功能 更为方便的扩展BizTalk custom adapter 的交互方式,只需要实现IAssemblyE ...
- Mego开发文档 - 索引
Mego 开发文档 Mego 快速概述 主要特性 获取Mego 使用流程 模型 查询 保存数据 入门 Mego 快速开始 创建项目 安装Nuget包 创建连接字符串 创建模型及数据上下文(添加引用) ...
- 【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
漏洞影响版本:v9.5.8.v9.6.0 Step1: 访问:http://www.xxx.com/index.php?m=wap&a=index&siteid=1, 获取返回的coo ...