题面



BZOJ传送门(中文题面但是权限题)

HDU传送门(英文题面)

分析

定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]}f[i]=max\{f[j]-p[j]+r[j]+(d[i]-d[j]-1)*g[j]\}f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]}

显然可以斜率优化,移项之后得到(f[j]−p[j]+r[j]−d[j]∗g[j]−g[j])=(−d[i]∗g[j])+(f[i])(f[j]-p[j]+r[j]-d[j]*g[j]-g[j])=(-d[i]*g[j])+(f[i])(f[j]−p[j]+r[j]−d[j]∗g[j]−g[j])=(−d[i]∗g[j])+(f[i])

也就是y=kx+by=kx+by=kx+b的形式,我们要让f[i]f[i]f[i]最大,也就是截距最大.那么维护一个上凸包就行了.为了求凸包插入点的xxx坐标单增,于是用CDQCDQCDQ分治来转移,转移时用归并排序.

  • 啊啊啊啊啊啊啊啊啊啊啊啊啊 把whilewhilewhile写成ififif然后WA爆了

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. template<typename T>inline void read(T &num) {
  5. char ch; int flg=1;
  6. while((ch=getchar())<'0'||ch>'9')if(ch=='-')flg=-flg;
  7. for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
  8. num*=flg;
  9. }
  10. const int MAXN = 100005;
  11. const double eps = 1e-10;
  12. struct Vector {
  13. LL x, y;
  14. Vector(){}
  15. Vector(LL _x, LL _y):x(_x), y(_y){}
  16. inline Vector operator -(const Vector &o) { return Vector(x-o.x, y-o.y); }
  17. inline double operator *(const Vector &o) { return (double)x*o.y - (double)y*o.x; } //会炸longlong,只有用double
  18. }p[MAXN], Q[MAXN];
  19. LL f[MAXN];
  20. struct Node {
  21. LL p, r, d, g, x, y; int id;
  22. inline void init() {
  23. read(d), read(p), read(r), read(g);
  24. x = g, y = -p+r-d*g-g;
  25. }
  26. }a[MAXN], tmp[MAXN];
  27. inline bool cmpD(const Node &A, const Node &B) { return A.d < B.d; }
  28. inline bool cmp(const Node &A, const Node &B) {
  29. return A.x == B.x ? A.y + f[A.id] < B.y + f[B.id] : A.x < B.x;
  30. }
  31. inline int dcmp(double x) {
  32. return x < -eps ? -1 : x < eps ? 0 : 1;
  33. }
  34. inline LL line(const Vector &P, LL k) { return P.y - k*P.x; } //求截距
  35. void CDQ(int l, int r) {
  36. if(l == r) { f[l] = max(f[l], f[l-1]); return; }
  37. int mid = (l + r) >> 1;
  38. CDQ(l, mid);
  39. int n = 0, s = 0, t = 0;
  40. for(int i = l; i <= mid; ++i) if(f[a[i].id] >= a[i].p)
  41. p[++n] = Vector(a[i].x, a[i].y + f[a[i].id]);
  42. for(int i = 1; i <= n; ++i) {
  43. while(s+1 < t && dcmp((Q[t-1]-Q[t-2]) * (p[i]-Q[t-2])) >= 0) --t;
  44. Q[t++] = p[i];
  45. }
  46. for(int i = mid+1; i <= r; ++i) {
  47. while(s+1 < t && line(Q[s+1], -a[i].d) >= line(Q[s], -a[i].d)) ++s;
  48. if(s < t) f[i] = max(f[i], line(Q[s], -a[i].d));
  49. }
  50. CDQ(mid+1, r);
  51. int cur1 = l, cur2 = mid+1;
  52. for(int i = l; i <= r; ++i) {
  53. if(cur2 > r || (cur1 <= mid && cmp(a[cur1], a[cur2]))) tmp[i] = a[cur1++];
  54. else tmp[i] = a[cur2++];
  55. }
  56. for(int i = l; i <= r; ++i) a[i] = tmp[i];
  57. }
  58. int n, D, kase;
  59. int main () {
  60. while(read(n), read(f[0]), read(D), n+f[0]+D) {
  61. for(int i = 1; i <= n; ++i) a[i].init();
  62. a[++n].d = D + 1;
  63. sort(a + 1, a + n + 1, cmpD);
  64. for(int i = 1; i <= n; ++i) a[i].id = i, f[i] = 0;
  65. CDQ(1, n);
  66. printf("Case %d: %lld\n", ++kase, f[n]);
  67. }
  68. }
  69. //f[i] = f[j] - p[j] + r[j] + (D[i]-D[j]-1)*G[j]
  70. //f[i] + (-D[i])*G[j] = f[j] - p[j] + r[j] - (D[j]+1)*G[j]

HDU 3824/ BZOJ 3963 [WF2011]MachineWorks (斜率优化DP+CDQ分治维护凸包)的更多相关文章

  1. BZOJ 3963: [WF2011]MachineWorks 斜率优化 + splay动态维护凸包

    Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以 ...

  2. 【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治

    题目描述  给出一棵以1为根的带边权有根树,对于每个根节点以外的点$v$,如果它与其某个祖先$a$的距离$d$不超过$l_v$,则可以花费$p_vd+q_v$的代价从$v$到$a$.问从每个点到1花费 ...

  3. BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)

    BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...

  4. P4027 [NOI2007]货币兑换(斜率优化dp+cdq分治)

    P4027 [NOI2007]货币兑换 显然,如果某一天要买券,一定是把钱全部花掉.否则不是最优(攒着干啥) 我们设$f[j]$为第$j$天时用户手上最多有多少钱 设$w$为花完钱买到的$B$券数 $ ...

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

    题目: 一个斜率优化+CDQ好题 BZOJ2149 分析: 先吐槽一下题意:保留房子反而要给赔偿金是什么鬼哦-- 第一问是一个经典问题.直接求原序列的最长上升子序列是错误的.比如\(\{1,2,2,3 ...

  6. BZOJ 1492 [NOI2007]货币兑换Cash:斜率优化dp + cdq分治

    传送门 题意 初始时你有 $ s $ 元,接下来有 $ n $ 天. 在第 $ i $ 天,A券的价值为 $ A[i] $ ,B券的价值为 $ B[i] $ . 在第 $ i $ 天,你可以进行两种操 ...

  7. ●BZOJ 3963 [WF2011]MachineWorks

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3963 题解: 斜率优化DP,CDQ分治. 先按时间排序.(规定以下内容的第i台机器的卖出时间 ...

  8. BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]

    传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...

  9. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

随机推荐

  1. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  2. VisualStudioCode网页开发常用插件

    VS下载链接 提取码:usx8 VsCode扩展功能强大,在于他可以安装各种各样的插件来辅助开发.下面是我初学前端时常用的vscode开发插件 Chinese 汉化 Beautify 格式化javas ...

  3. Java 包的理解与使用

    java中的包可以分为两种:内置包.用户自己定义的包.这里介绍的是用户自定义的包. 一.包的使用 1.创建PackageTest.java package com.packtest; public c ...

  4. 通过jquery触发select自身的change事件

    ###通过jquery触发select自身的change事件 1.通过js来去触发select的change事件 代码如下:包含了html部分和js部分 //html部分 <select cla ...

  5. 个人整理Python代码实例

    1.四位数字字母验证码的生成实例 import random if __name__ =="__main__": #四位数字字母验证码的生成 checkcode="&qu ...

  6. 写CSDN博客

    文章目录 前言 写博客的规范 写博客的小技巧 版权声明模板 博客表格模板 更改博客字体和颜色 LaTeX 数学公式 前言 这是一篇关于写CSDN博客的文章.记录我的博客规范,技巧,模板,心得. 写博客 ...

  7. chrome 调试 ios h5

    1,安装itunes, 否则无法识别iphone设备 2,开启调试模式 ,打开 iPhone 依次进入 设置 > Safari > 高级 > Web 检查 > 启用 3,下载 ...

  8. (一)JNDI基础

    一.简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可.在J2EE服务器上保存着一个数据库的多个连接.每一个连接通过DataSourc ...

  9. C# Combox控件绑定自定义数据

    DataTable dt = new DataTable();            dt.Columns.Add("name");            dt.Columns.A ...

  10. S2-029

    前言 S2-029漏洞是由于Struts2的i18n.text标签中的name属性的值会经过两次Ognl表达式解析. 正文 假设有如下缺陷代码: jsp文件中使用Struts2的i18n标签获取请求中 ...