【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]\} ...
随机推荐
- AC日记——[HNOI2007]紧急疏散evacuate bzoj 1189
[HNOI2007]紧急疏散evacuate 思路: 处理每个人到门的最短路: 然后二分答案: s向人连边流量1: 人向门拆分后的点连边流量1(拆成400,前一个点连当前点流量INF): 然后门向t连 ...
- EOJ 3.30 A. 打工时不可能打工的【贪心】
[链接]:https://acm.ecnu.edu.cn/contest/59/problem/A/ A. 打工时不可能打工的 Time limit per test: 2.0 seconds Mem ...
- ASIHTTPRequest 类库在iOS 7.0中,会有一些报错警告,需要稍作修改
1. if ([inputStream streamStatus] == NSStreamEventErrorOccurred) { 修改成: if ([inputStream streamStatu ...
- Android图片突出
概述 今天有个群友问 Android 图片凸出 效果怎么弄,早以前有过类似的需求,整个项目的提示框都是一个背景,背景上方有凸出半张图片,所以用layer-list写了一个背景来实现. 思路 随便画了一 ...
- (转)python装饰器二
Python装饰器进阶之二 保存被装饰方法的元数据 什么是方法的元数据 举个栗子 def hello(): print('Hello, World.') print(dir(hello)) 结果如下: ...
- 获取安装后Apache、MySQL、Nginx、PHP编译时参数
# cat /usr/local/apache2/build/config.nice //获取Apache编译时的参数 #!/bin/sh # #Created by configure & ...
- hadoop datanode节点超时时间设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长. HDFS默认的超时时长为10分 ...
- Spring3和Quartz2的应用实例
/** * 任务调度类 * @author Joyce.Luo * @date 2015-3-31 下午03:32:04 * @version V3.0 * @since Tomcat6.0,Jdk1 ...
- js 输入框增加删除操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一次JVM调优的笔记
1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上是连续的即可.Java堆就是各种对象分配和保存的内存空间,线程间共享.Java堆分为E ...