题意:有一个厨师,他买菜-做菜-买菜-做菜....-做菜,一共有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(分治+斜率优化)的更多相关文章

  1. UOJ#7. 【NOI2014】购票 点分治 斜率优化 凸包 二分

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ7.html 题解 这题是Unknown的弱化版. 如果这个问题出在序列上,那么显然可以CDQ分治 + 斜率 ...

  2. BZOJ3672 [Noi2014]购票 【点分治 + 斜率优化】

    题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...

  3. 【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 ...

  4. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

  5. BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化

    BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券 ...

  6. BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)

    BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...

  7. [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)

    [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...

  8. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  9. bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5541  Solved: 2228[Submit][Sta ...

随机推荐

  1. 使用VAE、CNN encoder+孤立森林检测ssl加密异常流的初探——真是一个忧伤的故事!!!

    ssl payload取1024字节,然后使用VAE检测异常的ssl流. 代码如下: from sklearn.model_selection import train_test_split from ...

  2. 用mobiscroll.js的treelist实现弹出下拉效果

    首先跟上次说的一样, 第一步:引入js.css样式 1)mobiscroll-2.13.2.full.min.css 2)jquery.min.js 3)mobiscroll-2.13.2.full. ...

  3. Nginx的Access日志记录的时机

    想当然了,所以犯了一个低级的错误... nginx的access访问日志可以记录下访问到nginx的相关信息.包含请求地址,请求路径,返回码,请求的处理时间等信息.. 然后问题来了,这个日志是什么时候 ...

  4. TNS

    Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器 ORACLE当中,如果想访问某 ...

  5. 【JAVA】关于向上转型与向下转型

    向上转型: 子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 如果子类重写了父类的方法,就根据这个引用指向调用子类重写的这个方法,不是调用父类的, ...

  6. day 69 权限的设置

    1.权限控制 1). 表结构的设置 2). 流程 1.登录 get: 通过中间件的白名单 re 获取到登录页面 post: 通过中间件的白名单,认证成功,保存权限信息, --ORM 去空的权限 去重 ...

  7. javascript进阶笔记(3)

    本篇文章我们来学习和讨论一下js中的闭包.闭包是纯函数式编程的一个特性,因为它们能够大大简化复杂的操作.在js中,闭包的重要性不言而喻! 简单的说,闭包(closure)是 一个函数在创建时 允许 该 ...

  8. 自定义String

    // ShStringNew.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #inclu ...

  9. springboot学习章节代码-spring高级话题

    1.Spring Aware(获取Spring容器的服务) hi, i am guodaxia! test.txt package com.zhen.highlights_spring4.ch3.aw ...

  10. 90%会搞错的JavaScript闭包问题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...