BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
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
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef double f2;
#define N 200050
#define eps 1e-6
#define mem(x) memset(x,0,sizeof(x))
ll f[N],D[N],P[N],R[N],G[N],C;
int n,Case,S[N],t[N],tmp[N];
#define Y(j) (f[j]-P[j]-D[j]*G[j]-G[j]+R[j])
#define X(j) (G[j])
#define K(i) (-D[i])
struct A {
ll d,p,r,g;
bool operator < (const A &x) const {
return d<x.d;
}
}a[N];
f2 getK(int p1,int p2) {
if(fabs(X(p2)-X(p1))<eps) return Y(p2)>Y(p1)?1e15:-1e15;
return (1.0*Y(p2)-Y(p1))/(X(p2)-X(p1));
}
void solve(int l,int r) {
if(l==r) return ;
int mid=(l+r)>>1;
solve(l,mid);
int i,j,k;
int top=0;
for(i=l;i<=mid;i++) {
if(f[t[i]]<P[t[i]]) continue;
while(top>1&&getK(S[top-1],S[top])<=getK(S[top-1],t[i])) top--;
S[++top]=t[i];
}
for(j=1,i=mid+1;i<=r;i++) {
while(j<top&&getK(S[j],S[j+1])+eps>=K(t[i])) j++;
f[t[i]]=max(f[t[i]],Y(S[j])-K(t[i])*X(S[j]));
}
solve(mid+1,r);
i=l,j=l,k=mid+1;
while(j<=mid&&k<=r) {
if(X(t[j])<X(t[k])) tmp[i++]=t[j++];
else tmp[i++]=t[k++];
}
while(j<=mid) tmp[i++]=t[j++];
while(k<=r) tmp[i++]=t[k++];
for(i=l;i<=r;i++) t[i]=tmp[i];
}
int work() {
Case++;
ll tmp;
scanf("%d%lld%lld",&n,&C,&tmp); D[n+1]=tmp+1;
if(n==0) return 0;
int i,j;
for(i=1;i<=n;i++) {
scanf("%lld%lld%lld%lld",&a[i].d,&a[i].p,&a[i].r,&a[i].g);
}
/*if(Case!=17) return 1;
printf("%d %lld %lld\n",n,C,tmp);
for(i=1;i<=n;i++) printf("%lld %lld %lld %lld\n",a[i].d,a[i].p,a[i].r,a[i].g);
return 0;*/
sort(a+1,a+n+1);
for(i=1;i<=n;i++) D[i]=a[i].d,P[i]=a[i].p,R[i]=a[i].r,G[i]=a[i].g,t[i]=i;
// for(i=1;i<=n;i++) printf("%lld\n",D[i]);
n++; f[0]=C; t[n]=n;
for(i=1;i<=n;i++) f[i]=-K(i)*X(0)+Y(0);
solve(1,n);
/*for(i=1;i<=n;i++) {
for(j=1;j<i;j++) {
if(f[j]>=P[j])
f[i]=max(f[i],-K(i)*X(j)+Y(j));
}
printf("%lld\n",f[i]);
}*/
printf("Case %d: %lld\n",Case,f[n]);
return 1;
}
int main() {
while(1) {
mem(a); mem(D); mem(P); mem(R); mem(f); mem(G); mem(t); mem(tmp); mem(S);
int tmp=work();
if(!tmp) return 0;
}
}
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治的更多相关文章
- 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3396 Solved: 1434[Submit][Sta ...
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...
- BZOJ3963 WF2011MachineWorks(动态规划+斜率优化+cdq分治)
按卖出时间排序后,设f[i]为买下第i台机器后的当前最大收益,则显然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,应设为-inf以表示无法购买第i台机器. ...
- bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)
设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...
- [Noi2014]购票 BZOJ3672 点分治+斜率优化+CDQ分治
Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治
[BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】
题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...
随机推荐
- 深入V8引擎-Time核心方法之mac篇
由于底层逻辑实现不同操作系统区别很大,所以干脆分篇来说. 主要讲一下Time.TimeTicks两个类里面对于时间戳的实现,其余的运算符重载.边缘工具方法就不看了,先是Time. Time 类本身的说 ...
- 洛谷——P2049 魔术棋子
P2049 魔术棋子 题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走 ...
- String的引用传递
一 引用传递的三个范例 范例一 package com.mtzsoft; /** * 范例一 * * @author Administrator * */ public class Test1 { p ...
- php使用strpos,strstr,strchr注意啦,若是数字查找则会当成ASCII码处理
strpos,strstr,strchr都是查找某字符出现的位置,若未找到,则返回false(判断是===) 如: var_dump(strpos("oa",'97')); var ...
- 使用uilabel重新自调整高度后显示横线和竖线问题
这个使用uilabel自调节高度发现的问题,代码如下: //content label NSString *contentValue = ((Messag ...
- 【effective c++】定制new和delete
条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象.array所用的内存由operator new[]分配出来,并由ope ...
- spring-quartz定时任务使用小结
在实际项目中,通常须要用到定时任务(定时作业).spring框架提供了非常好的实现. 1. 下载spring-quartz插件包 这里默认当前系统中是集成了spring框架的基本功能的.去网上下载s ...
- 微信小程序 开发环境配置
1.注册小程序 (1)微信公众平台:https://mp.weixin.qq.com/(2)立即注册 (3)流程 (4)小程序注册 (5)填写相关信息,并去邮箱激活.这样小程序的账号就注册完成了. 2 ...
- Oracle创建JOB定时任务
--- DECLARE JOB NUMBER;BEGIN DBMS_JOB.SUBMIT( JOB=>JOB, WHAT=>'CTABLE_T ...
- PHP读取excel(6)
有时候我们只需要读取某些指定sheet,具体代码如下: <?php header("Content-Type:text/html;charset=utf-8"); //引入读 ...