【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=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相关推荐
- BZOJ - 3963: [WF2011]MachineWorks
3963: [WF2011]MachineWorks 显然中途卖掉是不合算的,咱只考虑在有机器出售的那一天换一个机器的情况. 记$dp_i$为换成第$i$个机器时拥有的钱.为了方便处理,咱在$n+1$ ...
- 【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜
[算法]贪心扫描线(+堆) [题意]给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数. [题解] 参考:[bzoj1707]: [U ...
- 【BZOJ】【1041】【HAOI2008】圆周上的点
数学 orz hzwer 完全不会做-- 很纠结啊,如果将来再遇到这种题,还是很难下手啊-- 引用题解: [分析]: 样例图示: 首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否 ...
- 【BZOJ】【1036】树的统计
嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...
- 【BZOJ】【3442】学习小组
网络流/费用流 orz zyf 裸的费用流,根据题目描述即可建出如下的图: S->i 费用表示每有一个加入第 i 个小组的学生,需要花的钱,由于是跟流量(人数)的二次方相关,所以要拆边--然后每 ...
- 【BZOJ】1711: [Usaco2007 Open]Dining吃饭
[算法]最大流 [题解] S连向食物连向牛连向牛'连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...
- 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信
[题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...
- 【BZOJ】1299: [LLH邀请赛]巧克力棒
[算法]博弈论 [题解]这道题不是典型的SG函数题了. 不把它当成游戏看待,那么这道题是在说n个石子堆,每次可以加入若干个或进行Nim游戏. 我们当前先手,则考虑构造必败态来获胜. 当前已加入的NIm ...
- 【BZOJ】1013 [JSOI2008]球形空间产生器sphere
[算法]高斯消元 [题解] 建矩阵; for i 找到同列绝对值最大数字; 交换; for k(行) j(列)(倒序) 除法; for i(倒序) for j 减去已知元素 除到右边; #incl ...
- 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...
最新文章
- java string 连续字符_Java中字符串中连续相同字符去重方法
- Android开发之CoordinatorLayout使用详解一
- 查看和修改sql环境变量
- 如何在Java中选择Map/List/Set
- 获取分辨率函数是什么_深度学习应用“Zero Shot”超分辨率重构图像
- window的onresize执行多次的解决方法
- hduoj2094产生冠军
- 四大主流芯片架构(X86、ARM、RISC-V和MIPS)
- Django 时间与时区设置问题
- 用于数据分析的Python – Pandas
- python mysql查表_python进阶(十、mysql:单表查询)
- thinkphp3.2.3在nginx环境下“__PUBLIC__“路径错误、URL跳转路径错误解决方案
- linux 远程桌面配置,linux 远程桌面的配置
- django 1.8 官方文档翻译: 2-5-2 进行原始的sql查询
- 淡季没事情做,你们是怎么上完8个钟的
- MinDoc安装指南(v0.12)
- stm32h743单片机嵌入式学习笔记2-单片机获取电容触摸屏原理
- lcs问题java_动态规划法(十)最长公共子序列(LCS)问题
- matlab bfs函数,Matlab脚本和函数
- cisco 交换机 获取 转发表_思科交换机端口号、终端IP地址和MAC地址的互查