Gym - 101806R :Recipe(分治+斜率优化)
题意:有一个厨师,他买菜-做菜-买菜-做菜....-做菜,一共有N天,他的冰箱里只能有一个菜,在他做菜的第二天才会买菜,如果菜不做,放在冰箱里,每天新鲜程度会下降1。 第一天也会买菜,第i天的菜新鲜程度的Fi,厨艺是Ci,(厨艺会增长),要求这一天做的菜的新鲜长度大于等于Li。
思路:即dpi=max dp[j]+[F[j+1]-(i-(j+1))]*Ci (满足Li>=F[j+1]-(i-j-1)); 表示成b=y+kx的可以求最大值,表示成b=y-kx的可以求最小值。
由于k=Ci是单增的,所以想到斜率优化,可以把原方程化为:dp i=max dpj +[F[j+1]+(j+1)]*Ci - i*Ci 满足(Li+i>=F[j+1]+j+1);
而由于有括号里的限制,我们不能简单的斜率优化DP。 而考虑分治,分治的情况下,我们可以把Mid左边的按照Fi+i排序,右边的按照Li+i排序,如果满足括号条件,则把左边加入凸包, 右边更新答案。 这个时候由于不是按下标插入,所以x不是单调的,所以我们要在凸包上二分答案。
#include<bits/stdc++.h>
#define pii pair<ll,int>
#define mp make_pair
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=1e9;
ll dp[maxn],F[maxn],C[maxn],L[maxn];
pii a[maxn],b[maxn]; int q[maxn],top;
ll getans(int p,int k)
{
return dp[k]+C[p]*F[k+]-C[p]*p;
}
void update(int p)
{
if(top==) return;int L=,R=top-,Mid;
dp[p]=max(dp[p],getans(p,q[top]));
while(L<=R){
Mid=(L+R)>>;
ll tmp1=getans(p,q[Mid]),tmp2=getans(p,q[Mid+]);
if(tmp1>tmp2) R=Mid-,dp[p]=max(dp[p],tmp1);
else L=Mid+,dp[p]=max(dp[p],tmp2);
}
}
bool check(int p){
return (dp[p]-dp[q[top]])*(F[p+]-F[q[top-]+])<=
(dp[p]-dp[q[top-]])*(F[p+]-F[q[top]+]);
}
void add(int p)
{
if(dp[p]==-inf) return ;
if(top>&&F[p+]==F[q[top]+]&&dp[p]>dp[q[top]]) top--;
while(top>&&check(p)) top--;
q[++top]=p;
}
void solve(int Le,int Ri)
{
if(Le==Ri) return ;
int Mid=(Le+Ri)>>;
solve(Le,Mid);
int tot1=,tot2=; top=;
rep(i,Le,Mid) a[++tot1]=mp(F[i+],i);
rep(i,Mid+,Ri) b[++tot2]=mp(L[i],i);
sort(a+,a+tot1+); sort(b+,b+tot2+);
reverse(a+,a+tot1+); reverse(b+,b+tot2+);
for(int i=,j=;i<=tot2;i++){
while(j<=tot1&&b[i].first<=a[j].first){
add(a[j].second); j++;
}
update(b[i].second);
}
solve(Mid+,Ri);
}
int main()
{
int N; scanf("%d",&N);
rep(i,,N) scanf("%lld",&F[i]),F[i]+=i;
rep(i,,N) scanf("%lld",&C[i]);
rep(i,,N) scanf("%lld",&L[i]),L[i]+=i;
rep(i,,N) dp[i]=-inf;
solve(,N);
if(dp[N]==-inf) puts("Impossible");
else printf("%lld\n",dp[N]);
return ;
}
Gym - 101806R :Recipe(分治+斜率优化)的更多相关文章
- UOJ#7. 【NOI2014】购票    点分治 斜率优化 凸包 二分
		原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ7.html 题解 这题是Unknown的弱化版. 如果这个问题出在序列上,那么显然可以CDQ分治 + 斜率 ... 
- BZOJ3672 [Noi2014]购票  【点分治 + 斜率优化】
		题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ... 
- 【uoj#244】[UER #7]短路  CDQ分治+斜率优化dp
		题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ... 
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
		BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ... 
- BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化
		BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券 ... 
- BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)
		BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ... 
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
		[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ... 
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
		传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ... 
- bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
		1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5541 Solved: 2228[Submit][Sta ... 
随机推荐
- Qt一步一步实现插件通信(附源码)
			前一章已经实现了主程序调用加载插件功能,这一章描述主程序和插件间通信功能 说道Qt的通信必须要了解信号和槽的机制原理,这里不做论述,不清楚的同学去看看信号和槽机制 不废话直接上步骤,在上一章的基础 ... 
- java 常用命令
			#查看堆使用情况jmap -heap [pid]#查看占用内存高的对象jmap -histo:live [pid] | head -n 100#查看占用内存高的对象,dump成文件,线下分析jmap ... 
- react native 入门 (1)- 环境搭建, 创建第一个Hello World
			Create React Native App 是开始构建新的React Native应用程序的最简单方法.它允许您启动项目而无需安装或配置任何工具来构建本机代码 - 无需安装Xcode或Androi ... 
- pycuda安装 python<3.0
			cd pycudapython ./configure.py –cuda-root=/usr/local/cuda –cudadrv-lib-dir=/usr/lib –boost-inc-dir=/ ... 
- js代码之编程习惯
			编程习惯: 异常处理 如果你没有使用异常处理的习惯,这可能是因为你并未真正的理解它的作用.当你正确使用异常处理之后,你会发现你的代码最显著的变化就是:少了很多的 if-else 语句 . 虽然在 JS ... 
- 逆袭之旅DAY15.东软实训.Oracle.约束、序列、视图、索引、用户管理、角色
			2018-07-11 08:26:00 有某个学生运动会比赛信息的数据库,保存了如下的表: 运动员sporter表:(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系dep ... 
- jquery 元素选择器
			id选择器 JQuery 能使用CSS选择器来操作网页中的标签元素.如果想要通过一个id号去查找另一个元素就可以使用下面格式的选择 $('#my_id') 其中my_id表示根据id选择器获取页面中的 ... 
- java集合框架图
- bzoj4310
			题解: 后缀数组求出本质不同的串 然后二分答案 贪心判断是否可行 代码: #include<bits/stdc++.h> ; using namespace std; typedef lo ... 
- MySQL字符集与校对
			一.什么是字符集与校对 1.字符集与校对 字符集是指一种从二进制编码到某种字符符号的映射. 校队是指一组用于某个字符集的配许规则. 2.utf8与utf8mb4 标准的UTF-8字符集编码是可以使用1 ... 
