【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<=10^5),C是在转型期开始时公司拥有的美元数量(C<=10^9),D是转型期持续的天数(D<=10^9)。
之后的N行每一行描述了一台机器的情况。每一行有4个正整数Di,Pi,Ri和Gi,分别表示这台机器卖出的时间,购买这台机器需要的美元数量,卖出这台机器的折扣价和使用这台机器可以得到的利润。这些数字满足1<=Di<=D,1<=Ri<Pi<=10^9且1<=Gi<=10^9.
最后一组测试用例后面的一行由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

题解:来来来,先列式子:设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);}
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7236399.html

【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化相关推荐

  1. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  2. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  3. CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】

    正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树,从xxx跳到yyy(要求yyy在xxx的子树中)会产生Ax∗ByA_x*B ...

  4. [WF2011] MachineWorks(李超树优化dp)

    [WF2011]MachineWorks problem BZOJ3963 solution 来得比较快的是,直接设 dpi,j:dp_{i,j}:dpi,j​: 考虑第 jjj 天换购 iii 机器 ...

  5. 【BZOJ2149】拆迁队,分治+斜率优化DP

    传送门 思路还不错的一道题目,难度不大,但是我在写的时候出了一些细节上的错误 显然题目中的两问都可以通过DP来解决 f[i]f[i]表示保留旧房子ii时,1-i1-i最多能保留多少个旧房子 g[i]g ...

  6. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构 ...

  7. 时空旅行(dfs序+线段树分治+斜率优化)

    时空旅行 题意: 给定一棵以000为根的树,每个节点上有信息(一种是增加某个带权三维点,一种是删除某个带权三维点):询问要求从根节点到某个节点的信息总和中找到一个最优带权三维点. 思路: 首先,每个星 ...

  8. 【分治+斜率优化】BZOJ2149拆迁队 CF660F Bear and Bowling 4

    BZOJ2149拆迁队 [题目] 原题地址 题目大意不想写. [题目分析] 斜率优化的dp是显然的,然后就是怎么维护的问题了. [解题思路] 这题显然就是一个斜率优化的dp,然后分治的时候维护一下凸壳 ...

  9. 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治

    [BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...

最新文章

  1. javascript_治愈JavaScript疲劳的研究计划
  2. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
  3. js 月份加6个月_12月AHA HS大众急救认证培训22个城市报名开启!2021年1~6月份课程预售限时开启!!...
  4. python idle怎么用_python的idle如何使用
  5. C++Bubble sort冒泡排序的实现算法(附完整源码)
  6. 卸载。net开发的服务
  7. 数据结构与算法 - 递归回溯(迷宫问题)
  8. linux 线程优先级算法,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...
  9. windows下修改host不生效的解决方法
  10. 数据模型同学看过来|代码案例实操来袭
  11. RAC环境下配置TAF (Final)
  12. 在Windows Embedded CE下进行Native C++开发,一次错误使用多线程的经验教训
  13. LeetCode刷题-中心对称数
  14. MySql获取某天是一年的第几周
  15. 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
  16. wlan消失 网络适配器文件夹空了 设备管理器黄色感叹号 wifi那里看不到任何WiFi解决
  17. stm32 RO RW ZI
  18. 2020中国云计算公司排名 哪家的云服务器最好用?
  19. Python基础:break语句知识详解
  20. 第一章:电子商务的概述

热门文章

  1. SEO查询指令,非常值得你收藏!
  2. 各大知名企业的Research展示
  3. 一套外企的数据库设计面试题
  4. 使用MasterPage遇到的问题
  5. npm构建脚本_NPM脚本简介
  6. graphpad做折线图后怎么保存_农村的干豆角怎么做的?农村妹子教你两个窍门,保存2年都不会坏...
  7. Python组合数据类型之集合类型
  8. TCP和UDP传输特点
  9. 计算机组成原理-第3章-3.1
  10. Java遍历Map对象的四种方式