【BZOJ】3963: [WF2011]MachineWorks
【题意】给定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=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
const double eps=1e-,inf=;
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-],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+);
if(f[l]<a[l].p)a[l].g=-;
return;
}
int mid=(l+r)>>;
int x1=l-,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=;
for(int i=l;i<=mid;i++)if(~a[i].g){
while(top>&&slope(s[top],i)<slope(s[top-],s[top]))top--;
s[++top]=i;
}
int x=;
for(int i=mid+;i<=r;i++){
while(x<top&&slope(s[x],s[x+])<-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+,r);
x1=l,x2=mid+;
for(int i=l;i<=r;i++){
if(x1==mid+)b[i]=a[x2++];else
if(x2==r+)b[i]=a[x1++];else
if(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[]=read();m=read();
int T=;
while(n||f[]||m){
T++;
for(int i=;i<=n;i++)a[i].d=read(),a[i].p=read(),a[i].r=read(),a[i].g=read();
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)a[i].id=n-i+;
a[++n]=(cyc){m+,,,,n,,};
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)f[i]=;
CDQ(,n);
printf("Case %d: %lld\n",T,f[n]);
n=read();f[]=read();m=read();
}
return ;
}
代码中使用的方程时(A[j]-A[k])/(g[j]-g[k])<-d[i] ,g[j]>g[k]。
【BZOJ】3963: [WF2011]MachineWorks的更多相关文章
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- 【BZOJ】【3083】遥远的国度
树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...
- 【BZOJ】【2434】【NOI2011】阿狸的打字机
AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
随机推荐
- tomcat配置服务
1.在server中右键添加tomcat 2.双击tomcat打开配置窗口添加jvm参数 -Doapath="C:\exeye-workspace\exEyeWeb\oadoc" ...
- Java对象创建过程补遗
一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...
- 词法分析用c++实现的
#include<stdio.h>#include<string.h>int i,j,k,sign,flag,number,run;char ch;char word[10]; ...
- 《高性能JavaScript》学习笔记(2)——日更中
我说日更就日更,接着....今天从缓冲布局信息开始啦! -------------------2016-7-22 21:09:12------------------------------- 14. ...
- Ansible基础配置与常用模块使用
环境介绍: Ansible服务端IP:192.168.2.215 Ansible客户端IP:192.168.2.216.192.168.2.218.192.168.2.113 一.创建Ansibl ...
- paoding rose controller包及文件名命名规则
1.包命名规则:xxx.xxx.controllers(否则扫描不到)
- windows下的coreseek安装及PHP调用入门
转载:http://zhan.renren.com/longmensoft?gid=3602888498043096197&checked=true 把我的运行环境简单说一下:windows ...
- Windows搭建Log4Net+FileBeat+ELK日志分析系统过程
参考博客:http://udn.yyuap.com/thread-54591-1-1.html ; https://www.cnblogs.com/yanbinliu/p/6208626.html ; ...
- Linux的cut命令
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn] [file] 或 cut ...
- python的N个小功能(更新文件)
########################################################################## #对于第二份文件:第一份与第二份不相同,以第二份为 ...