【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
【BZOJ3963】[WF2011]MachineWorks
Description
Input
Output
Sample Input
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
题解:来来来,先列式子:设f[i]表示在还没有买机器i(想买还没买)时,所能得到的最大收益,那么有:
f[i]=max{f[j]+R[j]-P[j]+G[j]*(D[i]-D[j]-1)} (D[j]<D[i],f[j]>=P[j])
移项搞一搞,感觉像是斜率优化,但是好像x不单调?依旧套用cash那题的做法。上cdq分治,左边按x单调,右边按k单调,用左边更新右边即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,h,t,T;
int q[maxn];
struct node
{
ll P,R,D,G,f;
}s[maxn],p[maxn];
ll X(int a)
{
return s[a].G;
}
ll Y(int a)
{
return s[a].P-s[a].R+s[a].G+s[a].G*s[a].D-s[a].f;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
bool cmpx(node a,node b)
{
return a.G<b.G;
}
bool cmpk(node a,node b)
{
return a.D<b.D;
}
long double slope(int a,int b)
{
if(X(a)==X(b)) return (long double)(Y(a)<Y(b)?2147483647:-2147483647);
return (long double)(Y(b)-Y(a))/(X(b)-X(a));
}
void solve(int l,int r)
{
if(l==r)
{
s[l].f=max(s[l].f,s[l-1].f);
return ;
}
int mid=l+r>>1,i,h1=l,h2=mid+1;
solve(l,mid);
h=1,t=0;
for(i=l;i<=mid;i++)
{
if(s[i].f<s[i].P) continue;
while(h<t&&slope(q[t-1],q[t])>=slope(q[t],i)) t--;
q[++t]=i;
}
for(i=mid+1;i<=r;i++)
{
while(h<t&&slope(q[h],q[h+1])<=s[i].D) h++;
s[i].f=max(s[i].f,s[i-1].f);
if(h<=t) s[i].f=max(s[i].f,s[q[h]].f-s[q[h]].P+s[q[h]].R+s[q[h]].G*(s[i].D-s[q[h]].D-1));
}
solve(mid+1,r);
for(i=l;i<=r;i++)
{
if(h1<=mid&&(h2>r||X(h1)<=X(h2))) p[i]=s[h1++];
else p[i]=s[h2++];
}
for(i=l;i<=r;i++) s[i]=p[i];
}
int main()
{
while(1)
{
memset(s,0,sizeof(s));
n=rd(),s[0].f=rd(),s[n+1].D=rd()+1;
if(!n) return 0;
int i;
for(i=1;i<=n;i++) s[i].D=rd(),s[i].P=rd(),s[i].R=rd(),s[i].G=rd();
n++;
sort(s,s+n+1,cmpk);
solve(0,n);
sort(s,s+n+1,cmpk);
printf("Case %d: %lld\n",++T,s[n].f);
}
}
【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化的更多相关文章
- 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. 就是普通的斜率优化因为有两 ...
- BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]
传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...
- 【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券).每个持有金券的 ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
- 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]\} ...
随机推荐
- LeetCode OJ--Anagrams **
https://oj.leetcode.com/problems/anagrams/ 在一个vector<string>中,找到所有经过顺序变换,可以变成一样的 string. 首先,对每 ...
- Android修改包名的方法,简单粗暴。
几分钟之内,简单粗暴的修改包名! 序:Android的新手玩家可能对修改包名这件事情很是烦恼,我这里给出一个最快的修改包名的方法,简单粗暴,喜欢的可以收藏一下. 开始修改 第一步:修改自己app mo ...
- 16Aspx.com-PHP企业整站源码 景观石材大理石类织梦模板 含手机移动端 完整源码 APP+PC
=============================================== 源码站长资源交易专业网-商业源码下载,VIP源码,程序交易,毕业设计交易,站长交易|- 16aspx.c ...
- 使用 Jmeter 做 Web 接口测试-详解
接口测试概述 定义 WIKI定义:接口测试作为集成测 试的一部分,通过直接控制API来判断系统的功能性,可靠性,性能与安全性.API测试是没有界面的,执行在通讯 层.API 测试在自动化测试中有着重要 ...
- quick-coco2d下的事件
qucik下的事件机制很简洁,也很简单,能够处理大多数的自定义时间,我们新建一个类型,然后用扩展的方式实现事件,之前quick的文档上很详细,但是很悲哀,傻逼的的网站现在是404,记下来,怕到时候忘记 ...
- void*类型的指针
void*是一种特殊的指针类型,可以用来存放任意对象的地址.一个void*指针存放着一个地址,这一点和其他指针类似.不同的是,我们对它到底储存的是什么对象的地址并不了解: 比如:double a=2. ...
- centos 编译 安装php
安装phpcd /usr/local/srctar -zvxf php-5.3.10.tar.gzcd php-5.3.10mkdir -p /usr/local/php5 #建立php安装目录. ...
- LeetCode 290 Word Pattern(单词模式)(istringstream、vector、map)(*)
翻译 给定一个模式,和一个字符串str.返回str是否符合同样的模式. 这里的符合意味着全然的匹配,所以这是一个一对多的映射,在pattern中是一个字母.在str中是一个为空的单词. 比如: pat ...
- 【GLSL教程】(九)其他说明 【转】
http://blog.csdn.net/racehorse/article/details/6664775 法线矩阵 在很多顶点shader中都用到了gl_NormalMatrix.这里将介绍这个矩 ...
- 访问C指针的指针
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv){ void* vp; void** ...