自闭的一批....为什么斜率优化能这么自闭。

首先看到这个题的第一想法一定是按照一个维度进行排序。

那我们不妨直接按照\(h_i\)排序。

我们令\(dp[i]\)表示到了第\(i\)个矩形的答案是多少。

之后我们会发现,对于\(dp[i]\)的转移

\[dp[i]=dp[j-1]+h[j]*mn[j][i]
\]

其中\(mn[j][i]\)表示\(j到i\)的最小值。

qwq我们发现对于一个含有最值的柿子,他没法转移qwq

那我们不妨仔细考虑一下。

对于一个排在\(i\)后面的矩阵\(j\),如果他的\(w\)小于前缀\(w_{max}\),那么他就可以直接和之前某个矩阵合买了。

那这样就能去掉很多没有用的矩阵

剩下的矩阵就是一个\(h\)单调不升,\(w\)单调不降的序列。

那么这时候

\(dp[i]=max(dp[j-1]+h[j]*w[i])\)

经过推柿子

\[\frac{dp[j-1]-dp[k-1]}{h[j]-h[k]} > -w[i]
\]

然后直接斜率优化就可以qwq

这里有两个要注意的地方!!!!!!

首先,我们要比较的是当前的\(w\)和前缀\(w\)的最大值,而不能比较他的和上一个矩阵(因为上一个矩阵可能也是被完全替代的)。

其次!因为\(h[j]-h[k]<0\) 所以移项要改变!符号!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 2e5+1e2;
struct Node{
int h,w;
};
Node a[maxn];
int dp[maxn];
int n;
struct Point{
int x,y;
};
Point q[maxn];
int chacheng(Point x,Point y)
{
return x.x*y.y-x.y*y.x;
}
bool count(Point i,Point j,Point k)
{
Point x,y;
x.x=k.x-i.x;
x.y=k.y-i.y;
y.x=k.x-j.x;
y.y=k.y-j.y;
if (chacheng(x,y)>=0) return true;
return false;
}
int head=1,tail=0;
void push(Point x)
{
while(tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;
q[++tail]=x;
}
void pop(int lim)
{
while (tail>=head+1 && q[head+1].y-q[head].y<lim*(q[head+1].x-q[head].x)) head++;
}
bool cmp(Node a,Node b)
{
if(a.h==b.h) return a.w>b.w;
return a.h>b.h;
}
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i].w=read(),a[i].h=read();
sort(a+1,a+1+n,cmp);
push((Point){a[1].h,0});
dp[1]=a[1].w*a[1].h;
int mx = a[1].w;
for (int i=2;i<=n;i++)
{
if (a[i].w<=mx)
{
dp[i]=dp[i-1];
continue;
}
mx=max(mx,a[i].w);
dp[i]=dp[i-1]+a[i].w*a[i].h;
pop((-1ll)*a[i].w);
Point now = q[head];
dp[i]=min(now.y+a[i].w*now.x,dp[i]);
push((Point){a[i].h,dp[i-1]});
}
cout<<dp[n];
return 0;
}

洛谷2900 [USACO08MAR]土地征用Land Acquisition (斜率优化+dp)的更多相关文章

  1. 洛谷 P2900 [USACO08MAR]土地征用Land Acquisition 解题报告

    P2900 [USACO08MAR]土地征用Land Acquisition 题目描述 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选 ...

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

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

  3. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)

    洛谷题目传送门 用两种不一样的思路立体地理解斜率优化,你值得拥有. 题意分析 既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高(其实是蒟蒻把长方形立在了平面上)都比另一块要小,那么肯定是 ...

  4. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)

    题意 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比如约翰并购一块3 ...

  5. Luogu 2900 [USACO08MAR]土地征用Land Acquisition

    斜率优化dp. 首先发现如果存在$x$和$y$使得$len(x) \geq len(y)$并且$wid(x) \geq wid(y)$,那么$y$直接不考虑就好了,因为在买$x$的时候就把$y$顺便带 ...

  6. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  7. 洛谷P2365/5785 任务安排 题解 斜率优化DP

    任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...

  8. 洛谷3648 [APIO2014]序列分割(斜率优化+dp)

    首先对于这个题目. qwq 存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关. 举一个小栗子 \(a\ b\ c\) 将这个东西分成两块. 如果我们先分割\(ab\)之间的话,\(an ...

  9. 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)

    感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...

随机推荐

  1. TCP模拟QQ聊天功能

    需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...

  2. ES6扩展——正则扩展(u、y修饰符)

    //下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...

  3. linux centos7 移动文件到指定目录

    2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令  mv 文件名 指定目录  即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...

  4. kubernetes 使用 PV 和 PVC 管理数据存储

    文章链接 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的状态)重 ...

  5. Redis的安装、基本使用以及与SpringBoot的整合

    1.概述 Redis 是现在很流行的一个 NoSql 数据库,每秒读取可以达到10万次,能够将数据持久化,支持多种数据结构,容灾性强,易扩展,常用于项目的缓存中间件. 今天我们就来聊聊关于Redis的 ...

  6. Mysql - You can't specify target table '表名' for update in FROM clause 错误解决办法

    背景 在MySQL中,写SQL语句的时候 ,可能会遇到 You can't specify target table '表名' for update in FROM clause 这样的错误 错误含义 ...

  7. PPPoE技术白皮书(H3C)

    PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘要:PPPoE是一种通过一个远端接入设备为以太网上的主机提供接入服务,并可以对接入的每个主机实现控制和计费的技术.本文介绍了PPP ...

  8. throws声明异常中断式处理异常

    1.throws 编译期异常,一直往上抛最后是JVM处理(打印并中断程序) 2.声明多个或者直接声明父类

  9. wrap()包裹被选元素的内容

    <!doctype html><html><head><meta charset="utf-8"><title>修改代码 ...

  10. 【PHP数据结构】链表的相关逻辑操作

    链表的操作相对顺序表(数组)来说就复杂了许多.因为 PHP 确实已经为我们解决了很多数组操作上的问题,所以我们可以很方便的操作数组,也就不用为数组定义很多的逻辑操作.比如在 C 中,数组是有长度限制的 ...