【题意】给定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的更多相关文章

  1. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

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

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  5. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  6. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  7. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  8. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  9. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

随机推荐

  1. Java try catch

    /*   异常处理的捕捉形式: 这是可以对异常进行针对性处理的方式.   具体格式是: try { //需要被检测异常的代码. } catch(异常类 变量)//该变量用于接收发生的异常对象 { // ...

  2. 微信小程序 对接口常用

    @import '../expert/expert.wxss';   FZ._get('https://didu2.didu86.com/issun/index.php/Home/goodstype/ ...

  3. 关于WPS页面横向问题

    上图 即可进行横向竖向页面设置

  4. oracle 绝对值小于1的数值显示小数点前面的0

    SELECT DECODE(TRUNC(-.98),0,REPLACE(TO_CHAR(-.98), '.', '0.'),TO_CHAR(-.98))FROM DUAL;

  5. daemon not running的解决办法

    有时候,当我们执行 adb devices 或者 adb start-server 的时候,会出现下面的情况: * daemon not running. starting it now on por ...

  6. .net 下SSE使用

    HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送),基于数据推送是这样的,当数据源有新数据,它马上发送到客户端,不需要等待客户端请求.这 ...

  7. 【poj2154】Color Polya定理+欧拉函数

    题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题 ...

  8. Contest 4

    A:cf原题.当然是不是也没什么关系. #include<iostream> #include<cstdio> #include<cstdlib> #include ...

  9. BSGS和扩展BSGS

    BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...

  10. 【JQuery】文档操作

    一.前言 接着上一章的内容,接着JQuery的学习 二.内容 addClass 向被选元素添加一个或多个类 $(selector).addClass(class) $(selector).addCla ...