【题意】给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器。给定初始钱数c和总天数T,求最大收益。n<=10^5。

【算法】动态规划+斜率优化(CDQ分治)

【题解】机器按di排序,添加一台时间为T+1的机器,令f[i]表示di时不持有机器(最后一台机器在di之前卖出)的最大收益。

f[i]=max{ f[i-1] , f[j]-p[j]+r[j]+g[j]*(d[i]-d[j]-1) } , j<i

为了简化方程,令A[i]=f[j]-p[j]+r[j]-g[j]*(d[j]+1),则

f[i]=max{ f[i-1] , A[j]+g[j]*d[i] } , j<i

对于g[j]<g[k]的两个决策j和k,当k优于j时满足:

A[j]+g[j]*d[i]<A[k]+g[k]*d[i] 即 (A[j]-A[k])/(g[j]-g[k])>-d[i]

用CDQ分治维护上凸包,先按-d[i]排序,然后左子区间构造凸包(按g[]排序),右子区间顺序决策(按-d[i]排序),最后按x[]归并排序。

具体过程见CDQ分治维护斜率优化。

复杂度O(n log n)。

#include<cstdio>
#include<cctype>
#include<algorithm>
#define ll long long
using namespace std;
int read(){char c;int s=0,t=1;while(!isdigit(c=getchar()))if(c=='-')t=-1;do{s=s*10+c-'0';}while(isdigit(c=getchar()));return s*t;
}
const int maxn=100010;
const double eps=1e-10,inf=1000000000000;
int s[maxn],n,m;
ll f[maxn];
struct cyc{int d,p,r,g,id,x;ll y;}a[maxn],b[maxn];
bool cmp(cyc a,cyc b){return -a.d<-b.d;}
double slope(int A,int B){if(a[A].x==a[B].x){if(a[B].y<a[A].y)return inf;else return -inf;}return 1.0*(a[A].y-a[B].y)/(a[A].x-a[B].x);
}
void CDQ(int l,int r){if(l==r){f[l]=max(f[l-1],f[l]);a[l].x=a[l].g;a[l].y=f[l]-a[l].p+a[l].r-1ll*a[l].g*(a[l].d+1);if(f[l]<a[l].p)a[l].g=-1;return;}int mid=(l+r)>>1;int x1=l-1,x2=mid;for(int i=l;i<=r;i++)if(a[i].id<=mid)b[++x1]=a[i];else b[++x2]=a[i];for(int i=l;i<=r;i++)a[i]=b[i];CDQ(l,mid);int top=0;for(int i=l;i<=mid;i++)if(~a[i].g){while(top>1&&slope(s[top],i)<slope(s[top-1],s[top]))top--;s[++top]=i;}int x=1;for(int i=mid+1;i<=r;i++){while(x<top&&slope(s[x],s[x+1])<-a[i].d)x++;if(x<=top)f[a[i].id]=max(f[a[i].id],a[s[x]].y+1ll*a[s[x]].g*a[i].d);}CDQ(mid+1,r);x1=l,x2=mid+1;for(int i=l;i<=r;i++){if(x1==mid+1)b[i]=a[x2++];elseif(x2==r+1)b[i]=a[x1++];elseif(a[x1].g>a[x2].g)b[i]=a[x1++];else b[i]=a[x2++];}for(int i=l;i<=r;i++)a[i]=b[i];
}
int main(){n=read();f[0]=read();m=read();int T=0;while(n||f[0]||m){T++;for(int i=1;i<=n;i++)a[i].d=read(),a[i].p=read(),a[i].r=read(),a[i].g=read();sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++)a[i].id=n-i+1;a[++n]=(cyc){m+1,0,0,0,n,0,0};sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++)f[i]=0;CDQ(1,n);printf("Case %d: %lld\n",T,f[n]);n=read();f[0]=read();m=read();}return 0;
}

View Code

代码中使用的方程时(A[j]-A[k])/(g[j]-g[k])<-d[i] ,g[j]>g[k]。

转载于:https://www.cnblogs.com/onioncyc/p/8253066.html

【BZOJ】3963: [WF2011]MachineWorks相关推荐

  1. BZOJ - 3963: [WF2011]MachineWorks

    3963: [WF2011]MachineWorks 显然中途卖掉是不合算的,咱只考虑在有机器出售的那一天换一个机器的情况. 记$dp_i$为换成第$i$个机器时拥有的钱.为了方便处理,咱在$n+1$ ...

  2. 【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜

    [算法]贪心扫描线(+堆) [题意]给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数. [题解] 参考:[bzoj1707]: [U ...

  3. 【BZOJ】【1041】【HAOI2008】圆周上的点

    数学 orz hzwer 完全不会做-- 很纠结啊,如果将来再遇到这种题,还是很难下手啊-- 引用题解: [分析]: 样例图示: 首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否 ...

  4. 【BZOJ】【1036】树的统计

    嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...

  5. 【BZOJ】【3442】学习小组

    网络流/费用流 orz zyf 裸的费用流,根据题目描述即可建出如下的图: S->i 费用表示每有一个加入第 i 个小组的学生,需要花的钱,由于是跟流量(人数)的二次方相关,所以要拆边--然后每 ...

  6. 【BZOJ】1711: [Usaco2007 Open]Dining吃饭

    [算法]最大流 [题解] S连向食物连向牛连向牛'连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...

  7. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  8. 【BZOJ】1299: [LLH邀请赛]巧克力棒

    [算法]博弈论 [题解]这道题不是典型的SG函数题了. 不把它当成游戏看待,那么这道题是在说n个石子堆,每次可以加入若干个或进行Nim游戏. 我们当前先手,则考虑构造必败态来获胜. 当前已加入的NIm ...

  9. 【BZOJ】1013 [JSOI2008]球形空间产生器sphere

    [算法]高斯消元 [题解] 建矩阵; for i 找到同列绝对值最大数字; 交换; for k(行) j(列)(倒序)   除法; for i(倒序) for j 减去已知元素 除到右边; #incl ...

  10. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

最新文章

  1. java string 连续字符_Java中字符串中连续相同字符去重方法
  2. Android开发之CoordinatorLayout使用详解一
  3. 查看和修改sql环境变量
  4. 如何在Java中选择Map/List/Set
  5. 获取分辨率函数是什么_深度学习应用“Zero Shot”超分辨率重构图像
  6. window的onresize执行多次的解决方法
  7. hduoj2094产生冠军
  8. 四大主流芯片架构(X86、ARM、RISC-V和MIPS)
  9. Django 时间与时区设置问题
  10. 用于数据分析的Python – Pandas
  11. python mysql查表_python进阶(十、mysql:单表查询)
  12. thinkphp3.2.3在nginx环境下“__PUBLIC__“路径错误、URL跳转路径错误解决方案
  13. linux 远程桌面配置,linux 远程桌面的配置
  14. django 1.8 官方文档翻译: 2-5-2 进行原始的sql查询
  15. 淡季没事情做,你们是怎么上完8个钟的
  16. MinDoc安装指南(v0.12)
  17. stm32h743单片机嵌入式学习笔记2-单片机获取电容触摸屏原理
  18. lcs问题java_动态规划法(十)最长公共子序列(LCS)问题
  19. matlab bfs函数,Matlab脚本和函数
  20. cisco 交换机 获取 转发表_思科交换机端口号、终端IP地址和MAC地址的互查

热门文章

  1. 容器与拷贝构造函数的问题
  2. 2017.10.26-构建之法:现代软件工程-阅读笔记
  3. 2017.4.26-morning
  4. 9个Console命令
  5. Java开发笔记(一百三十七)JavaFX的标签
  6. Codeforces 160
  7. iOS之某公司iOS开发笔试题
  8. [转]printf 函数实现的深入剖析
  9. PHP getcwd() 函数
  10. 一如此前的回应,王劲将景驰科技总部搬到了广州