今天刚刷完了斜率优化DP,简单从头回顾一下。

\[首先,能写出DP方程应该是最重要的,毕竟斜率只是用来优化的
\]

那么一个DP方程能用斜率优化,具备一种形式:

\[f[i]+s1[i]+A[i]*B[j]=f[j]+s2[j]
\]

其中,f[i]表示所求值,(s1[i]、A[i])与(s2[j]、B[j])分别表示只与i或j有关的一个表达式(可以是只有常数项)。

然后就可以建立一个横坐标为B[j],斜率为A[i],纵坐标为f[j]+s2[j]的函数。如果横坐标有单调性,那么只需单调队列保留一个凸壳或凹壳即可(任务安排2),否则就像需要支持任意插入、查询(任务安排3、4)。


基本形式大概就是上面那样,接下来从题中看点特别的。

1、任务安排系列

  • 我们使用了费用提前计算思想。
  • 通过前缀和使得整个式子只包含与i,j有关的变量和常数,通过移项,使得式子简化成f[i]+s1[i]+A[i]*B[j]=f[j]+s2[j]的形式,直接省去了j的枚举,时间复杂度降到O(N)。

2、运输小猫

  • 通过每只小猫的游玩时间和位置信息,将其与饲养员出发时间建立联系,便与任务安排很像了。
  • 同样使用前缀和将所有变量转为只与i,j有关的变量,最终式子化简为标准形式,时间O(N)。

3、特别行动队、仓库建设、玩具装箱

  • 几乎没什么区别,将DP方程写出来之后,通过前缀和去化简变量,最终简化式子为标准形式即可。
从上面的这些题中可以看出,我们大量运用了前缀和,就是为了可以通过预处理将DP方程中的变量简化为只与i,j有关的量,以便将式子化为标准形式,$$所以斜率优化DP就是要去简化变量,转化式子,剩下的就可以斜率优化掉一层枚举了$$

4、但是前缀和并不万能,来看 “土地购买”

首先毫无头绪,没有像前几道题那样点明必须连续购买,而是想买多少卖多少,这朴素转移就很难,pu-tao↑。

但是为了比较好判断谁的l(长)比较大,先把他们按l sort一遍,得到一个a不严格递增的序列,由前几道题的做题经验想到应该取连续的一段,来证明一下:

反证 :

如果不应该取连续的一段,那么就是取不连续的,num[i]表示i在序列中的位置,设num[a]<num[b]<num[c],取a,c,不取b。

如果取c不取b,说明w[c](宽)<w[b],不然w[c]>w[b]&&l[c]>l[b]就必然会把b包括进来,接下来分类讨论一下:

  1. w[a]<=w[b]:



    显然b可以包括进a,不行。
  2. w[a]>w[b]:



    (1):w[a]是b所包括范围之内最大的w

    ①:w[a]是c所包括范围之内最大的w,因为l[b]<=l[c],所以a属于b更优。

    ②:w[a]不是c所包括范围之内最大的w,那就可以把c所包括的最大的w[x]的x给b,因为l[b]<=l[c].

    (2):w[a]不是b所包括范围之内最大的w,那么a不会对b的答案造成影响,给b更优。

    所以a应该跟b,即不连续的取一段不是最优解。
证毕

由上述证明过程引发出一个想法:$$ w[i]>w[j]\ and\ l[i]>l[j],j完全可以被i包含,j无用 $$,所以整个序列要去掉那些无用的元素,用以w为关键字单调递减队列跑一遍,即可得到最终序列,l递增,w递减:

由此可以写出DP方程:$$f[i]=f[j]+l[i]*w[j+1]$$,完美符合标准形式,切横坐标-w[j+1]具有单调性,直接跑单调队列即可。

pu-tao↑zher↑↓
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define laoda MAN
#define MAN What Can I Say?
typedef long long ll;
typedef pair<int,int> pii;
const ll linf=0x3f3f3f3f7fffffff;
inline int read(){
char c=getchar();int x=0;
bool f=1;
while(c<'0'||c>'9')f=c=='-'?0:1,c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f==0?-x:x;
}
const int N=5e4+10,inf=0x7f7f7f7f;
ll n,f[N],q[N],l=1,r,m[N];
struct jj{
ll a,b;//a->l,b->w
inline bool operator <(const jj &x)const{
return a<x.a;
}
}man[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=read();
for(int i=1;i<=n;++i){
man[i]={read(),read()};
}
sort(man+1,man+1+n);
for(int i=1;i<=n;++i){
while(l<=r&&man[q[r]].b<=man[i].b)--r;
q[++r]=i;
}
for(int i=l;i<=r;++i)
man[i-l+1]=man[q[i]];
n=r-l+1;
l=1,r=1;q[1]=0;
for(int i=1;i<=n;++i){
int j=q[l+1],k=q[l];
while(l<r&&f[j]-f[k]<=man[i].a*(man[k+1].b-man[j+1].b))k=q[++l],j=q[l+1];
f[i]=f[k]+man[i].a*man[k+1].b;
j=q[r],k=q[r-1];
while(l<r&&(f[j]-f[k])*(man[i+1].b-man[j+1].b)<=(f[i]-f[j])*(man[j+1].b-man[k+1].b))j=q[--r],k=q[r-1];
q[++r]=i;
}
cout<<f[n];
}

斜率优化DP简单总结&&“土地购买”题解的更多相关文章

  1. 蒟蒻关于斜率优化DP简单的总结

    斜率优化DP 题外话 考试的时候被这个玩意弄得瑟瑟发抖 大概是yybGG的Day4 小蒟蒻表示根本不会做..... 然后自己默默地搞了一下斜率优化 这里算是开始吗?? 其实我讲的会非常非常非常简单,, ...

  2. 2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)

    传送门 终究还是通宵了啊... 这是一道简单的斜率优化dp. 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块. 于是剩下的土地有一条边单增,另外一条单减. 我们假设a[i]是单减的,b ...

  3. BZOJ1597土地购买 【斜率优化DP】

    BZOJ1597土地购买 [斜率优化DP] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足( ...

  4. 土地购买 (斜率优化dp)

    土地购买 (斜率优化dp) 题目描述 农夫 \(John\) 准备扩大他的农场,他正在考虑$ N(1 \leqslant N \leqslant 50,000)$ 块长方形的土地. 每块土地的长宽满足 ...

  5. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...

  6. 【BZOJ1597】【Usaco2008 Mar】土地购买 斜率优化DP

    题目: 题目在这里 思路与做法: 这题如果想要直接dp的话不太好处理. 不过, 我们发现如果\(a[i].x>=a[j].x\)且\(a[i].y>=a[j].y\) \((\)a是输入的 ...

  7. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  8. 『土地征用 Land Acquisition 斜率优化DP』

    斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...

  9. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  10. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

随机推荐

  1. 英语词汇:simplistic和simple区别

    "Simplistic" 和 "simple" 都表示简单,但它们有不同的含义和语境: Simplistic: 含义: 过于简单化的,有贬义,表示忽略了复杂性或 ...

  2. 【转载】 Pytorch手动释放显存

    原文地址: http://www.shijinglei.com/2020/04/20/pytorch%E9%87%8A%E6%94%BE%E6%98%BE%E5%AD%98/ ============ ...

  3. ios滚动列表白屏问题

    移动端分页列表,在ios上滚动加载分页时候,使用scrollTop,会引起白屏问题. 看不少文章说是使用了-webkit-overflow-scrolling: touch;引起的硬件加速问题.亲测删 ...

  4. 关于对 Tomcat 进行小版本升级的快速解决方案

    1.背景描述 原来的 Tomcat 在部署时,使用的是最新的版本 9.0.40 . 经过一段时间后,在原来的 Tomcat 版本中,发现存在漏洞. 因此,需要将旧版本(9.0.40)升级到没有漏洞的新 ...

  5. 如何使用 Shebang

    什么是 Shebang? 简单来说,就是你在脚本开头看到的这个: #!/usr/bin/bash Shebang(也称为 hash-bang.pound-bang 或者 bang)是一个作为脚本文件中 ...

  6. Homebrew 使用

    使用 brew install brew uninstall|remove|rm brew list # *显示已安装软件列表 brew upgrade # 更新 Homebrew brew sear ...

  7. Electron32-ViteOS桌面版os系统|vue3+electron+arco客户端OS管理模板

    基于electron32+vue3 setup+pinia2桌面端os管理解决方案ElectronVue3OS. vue3-electron32-os全新原创Electron32+Vite5+Vue3 ...

  8. Kali初次使用,如何获得root权限?【转】

    最新的kali 系统,安装的时候会创建一个新用户,不是root的,然后安装软件的时候会要求root权限,要启用root账号可以按下面这个写的 方法1已经确认可以.方法2没尝试,自己试试吧. 1.确定用 ...

  9. 淘宝开放平台api申请,淘宝开放平台api租用,淘宝开放平台api无法申请,淘宝开放平台api暂停接入

    目前淘宝开放平台应用申请是关闭了的,已经无法申请到了,如果你是天猫店铺,可以申请供自己店铺使用的权限,如果你不是天猫店铺或者你是软件开发商,目前是申请不到权限的 如果你必须要用到这个权限包的话,可以联 ...

  10. Excel中制作目录的3种方法,你了解几种?

    点赞再看,养成习惯:言之无文,行而不远. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...