【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
【BZOJ3963】[WF2011]MachineWorks
Description
Input
Output
Sample Input
6 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
题解:来来来,先列式子:设f[i]表示在还没有买机器i(想买还没买)时,所能得到的最大收益,那么有:
f[i]=max{f[j]+R[j]-P[j]+G[j]*(D[i]-D[j]-1)} (D[j]<D[i],f[j]>=P[j])
移项搞一搞,感觉像是斜率优化,但是好像x不单调?依旧套用cash那题的做法。上cdq分治,左边按x单调,右边按k单调,用左边更新右边即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,h,t,T;
int q[maxn];
struct node
{ll P,R,D,G,f;
}s[maxn],p[maxn];
ll X(int a)
{return s[a].G;
}
ll Y(int a)
{return s[a].P-s[a].R+s[a].G+s[a].G*s[a].D-s[a].f;
}
int rd()
{int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
bool cmpx(node a,node b)
{return a.G<b.G;
}
bool cmpk(node a,node b)
{return a.D<b.D;
}
long double slope(int a,int b)
{if(X(a)==X(b)) return (long double)(Y(a)<Y(b)?2147483647:-2147483647);return (long double)(Y(b)-Y(a))/(X(b)-X(a));
}
void solve(int l,int r)
{if(l==r){s[l].f=max(s[l].f,s[l-1].f);return ;}int mid=l+r>>1,i,h1=l,h2=mid+1;solve(l,mid);h=1,t=0;for(i=l;i<=mid;i++){if(s[i].f<s[i].P) continue;while(h<t&&slope(q[t-1],q[t])>=slope(q[t],i)) t--;q[++t]=i;}for(i=mid+1;i<=r;i++){while(h<t&&slope(q[h],q[h+1])<=s[i].D) h++;s[i].f=max(s[i].f,s[i-1].f);if(h<=t) s[i].f=max(s[i].f,s[q[h]].f-s[q[h]].P+s[q[h]].R+s[q[h]].G*(s[i].D-s[q[h]].D-1));}solve(mid+1,r);for(i=l;i<=r;i++){if(h1<=mid&&(h2>r||X(h1)<=X(h2))) p[i]=s[h1++];else p[i]=s[h2++];}for(i=l;i<=r;i++) s[i]=p[i];
}
int main()
{while(1){memset(s,0,sizeof(s));n=rd(),s[0].f=rd(),s[n+1].D=rd()+1;if(!n) return 0;int i;for(i=1;i<=n;i++) s[i].D=rd(),s[i].P=rd(),s[i].R=rd(),s[i].G=rd();n++;sort(s,s+n+1,cmpk);solve(0,n);sort(s,s+n+1,cmpk);printf("Case %d: %lld\n",++T,s[n].f);}
}
转载于:https://www.cnblogs.com/CQzhangyu/p/7236399.html
【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化相关推荐
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- NOI2007 货币兑换 - CDQ分治斜率优化dp
斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...
- CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】
正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树,从xxx跳到yyy(要求yyy在xxx的子树中)会产生Ax∗ByA_x*B ...
- [WF2011] MachineWorks(李超树优化dp)
[WF2011]MachineWorks problem BZOJ3963 solution 来得比较快的是,直接设 dpi,j:dp_{i,j}:dpi,j: 考虑第 jjj 天换购 iii 机器 ...
- 【BZOJ2149】拆迁队,分治+斜率优化DP
传送门 思路还不错的一道题目,难度不大,但是我在写的时候出了一些细节上的错误 显然题目中的两问都可以通过DP来解决 f[i]f[i]表示保留旧房子ii时,1-i1-i最多能保留多少个旧房子 g[i]g ...
- 【BZOJ3672】[Noi2014]购票 树分治+斜率优化
[BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构 ...
- 时空旅行(dfs序+线段树分治+斜率优化)
时空旅行 题意: 给定一棵以000为根的树,每个节点上有信息(一种是增加某个带权三维点,一种是删除某个带权三维点):询问要求从根节点到某个节点的信息总和中找到一个最优带权三维点. 思路: 首先,每个星 ...
- 【分治+斜率优化】BZOJ2149拆迁队 CF660F Bear and Bowling 4
BZOJ2149拆迁队 [题目] 原题地址 题目大意不想写. [题目分析] 斜率优化的dp是显然的,然后就是怎么维护的问题了. [解题思路] 这题显然就是一个斜率优化的dp,然后分治的时候维护一下凸壳 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
最新文章
- javascript_治愈JavaScript疲劳的研究计划
- 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
- js 月份加6个月_12月AHA HS大众急救认证培训22个城市报名开启!2021年1~6月份课程预售限时开启!!...
- python idle怎么用_python的idle如何使用
- C++Bubble sort冒泡排序的实现算法(附完整源码)
- 卸载。net开发的服务
- 数据结构与算法 - 递归回溯(迷宫问题)
- linux 线程优先级算法,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...
- windows下修改host不生效的解决方法
- 数据模型同学看过来|代码案例实操来袭
- RAC环境下配置TAF (Final)
- 在Windows Embedded CE下进行Native C++开发,一次错误使用多线程的经验教训
- LeetCode刷题-中心对称数
- MySql获取某天是一年的第几周
- 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
- wlan消失 网络适配器文件夹空了 设备管理器黄色感叹号 wifi那里看不到任何WiFi解决
- stm32 RO RW ZI
- 2020中国云计算公司排名 哪家的云服务器最好用?
- Python基础:break语句知识详解
- 第一章:电子商务的概述