bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
2018-01-01 19:19
429 查看
3963: [WF2011]MachineWorks
Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 270 Solved: 80
[Submit][Status][Discuss]
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 206 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
转移并不满足单调啊,所以需要用cdq分治来维护单调的转移
也可以写splay
这篇博客写得不错https://www.geek-share.com/detail/2725597220.html
#include<bits/stdc++.h> #define N 100050 #define ll long long #define inf 2147483647 using namespace std; int n,m,D,s ;ll f ; struct date{int d,p,r,g,id;}q ,a ; //struct point{int x;ll y;}p ,b ; bool cmp1(date a,date b){return a.d<b.d;} ll X(int i){ return q[i].r+f[q[i].id]-q[i].p-(ll)q[i].g*(q[i].d+1); } int Y(int i){ return q[i].g; } double G(int i,int j){ // if(Y(i)==Y(j))return (double)(X(i)>X(j)?inf:-inf); return (double)(X(i)-X(j))/(double)(Y(i)-Y(j)); } void solve(int l,int r){ if(l>r)return; if(l==r){ f[l]=max(f[l],f[l-1]); return; } int mid=(l+r)>>1; int p1=l,p2=mid+1; //for(int i=l;i<=r;i++)q[i]=a[i]; solve(l,mid);int tp=0,h=1; for(int i=l;i<=mid;i++){ if(q[i].p>f[q[i].id])continue; if(Y(i)==Y(s[tp])&&tp){ if(X(i)>X(s[tp]))tp--; else continue; } while(tp>1&&G(s[tp],s[tp-1])<=G(i,s[tp]))tp--; s[++tp]=i; } for(int i=mid+1;i<=r;i++){ while(h<tp&&G(s[h],s[h+1])>=-q[i].d)h++; f[i]=max(f[i],f[i-1]); if(h<=tp)f[i]=max(f[i],f[q[s[h]].id]-q[s[h]].p+q[s[h]].r+(ll)q[s[h]].g*(q[i].d-q[s[h]].d-1)); } solve(mid+1,r); p1=l;p2=mid+1; for(int i=l;i<=r;i++){ if(p1<=mid&&q[p1].g<=q[p2].g)a[i]=q[p1++]; else if(p2<=r)a[i]=q[p2++]; else a[i]=q[p1++]; } for(int i=l;i<=r;i++)q[i]=a[i]; } int main(){ int cas=0; while(scanf("%d%d%d",&n,&m,&D)!=EOF){ cas++; if(!n&&!m&&!D)break; memset(f,-1,sizeof(f)); f[1]=f[0]=m;int d,p,r,g; for(int i=1;i<=n;i++) scanf("%d%d%d%d",&d,&p,&r,&g), q[i]=(date){d,p,r,g,i}; q[++n]=(date){D+1,0,0,0,n}; sort(q+1,q+1+n,cmp1); for(int i=1;i<=n;i++)q[i].id=i; solve(1,n); printf("Case %d: %lld\n",cas,f ); } return 0; }
相关文章推荐
- BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]
- [BZOJ 3963][WF2011]MachineWorks:CDQ分治|DP斜率优化
- [BZOJ3963][WF2011][CDQ分治][斜率优化][DP]MachineWorks
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
- 【BZOJ3963】【ACM-WF2011】MachineWorks(CDQ分治+斜率优化)
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
- [BZOJ3963][WF2011]MachineWorks(斜率优化dp+cdq分治)
- [BZOJ3963][WF2011]MachineWorks(斜率优化dp+cdq分治)
- [BZOJ4709][JSOI2011]柠檬(斜率优化DP)
- 【BZOJ4518】征途,斜率优化DP
- 【斜率优化DP】BZOJ1911 [Apio2010]特别行动队
- bzoj-3675 序列分割APIO2014 斜率优化dp
- [BZOJ3672][NOI2014]购票-点分治-CDQ分治-斜率优化DP
- BZOJ 1492 斜率优化dp && cdq分治
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
- [BZOJ1911][Apio2010]特别行动队(斜率优化dp)
- [BZOJ1010][HNOI2008]玩具装箱toy(斜率优化dp)
- BZOJ 斜率优化dp 1010: [HNOI2008]玩具装箱toy
- bzoj 1010 斜率优化DP
- 【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP