Description

题库链接

给你 \(n\) 块不同大小的土地。你可分批购买这些土地,每一批价格为这一批中最大的长乘最大的宽。问你买下所有土地的花费最小为多少。

\(1\leq n\leq 50000\)

Solution

有一个贪心的思想就是一块土地如果是 \(w_i\times h_i\),若 \(\exists j\) 满足 \(w_i\leq w_j,h_i\leq h_j\)。那么 \(i\) 这块土地一定不会参与到花费计算的。这是因为 \(i\) 这块土地可以放在 \(j\) 那一批,然后 \(i\) 的长和宽一定不是最大的。

因此我们把这些土地按 \(w\) 从小到大排序,那么 \(h\) 一定是单调递减的。基于此,我们还可以得出另外一个结论,同一批次在这个序列中一定是连续的一段。这是因为这一段的 \(w,h\) 最大值一定是在端点取,你把中间某个地不放在这一段是对这一段的花费不产生影响的,因此不如选上这一个点。

基于上述两个结论,我们可以对排完序的序列进行 DP。记 \(f_i\) 表示购买 \(1\sim i\) 的土地的最小的花费,那么 \(f_i=\min\{f_j+w_i\times h_j\}\)。

由于 \(w_i\) 和 \(h_j\) 单调性相反,因此可以用单调队列维护上凸包斜率优化解决。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 50000+5; int n, tot, q[N], head, tail;
struct tt {
int w, h;
bool operator < (const tt &b) const {
return w == b.w ? h < b.h : w < b.w;
}
} a[N], b[N];
long long f[N]; int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].w, &a[i].h);
sort(a+1, a+n+1);
for (int i = 1; i <= n; i++) {
while (tot && b[tot].h <= a[i].h) --tot;
b[++tot] = a[i];
}
n = tot; tail = -1;
for (int i = 1; i <= n; i++) {
while (head < tail && (-f[i-1]+f[q[tail]-1])*(b[i].h-b[q[tail-1]].h)
<= (-f[i-1]+f[q[tail-1]-1])*(b[i].h-b[q[tail]].h)) --tail;
q[++tail] = i;
while (head < tail && -f[q[head]-1]+f[q[head+1]-1] <= 1ll*b[i].w*(b[q[head]].h-b[q[head+1]].h)) ++head;
f[i] = f[q[head]-1]+1ll*b[q[head]].h*b[i].w;
}
printf("%lld\n", f[n]);
return 0;
}

[USACO 08MAR]土地购买的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  2. 1597: [Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit] ...

  3. 【BZOJ-1597】土地购买 DP + 斜率优化

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2931  Solved: 1091[Submit] ...

  4. 【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2474  Solved: 900[Submit][ ...

  5. 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3601  Solved: 1322 Descrip ...

  6. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  7. BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit] ...

  8. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5524  Solved: 2074[Submit] ...

  9. 【bzoj1597】[Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3739  Solved: 1376[Submit] ...

随机推荐

  1. Hadoop架构: 流水线(PipeLine)

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 流水线(PipeLine),简单地理解就是客户端向DataNode传输数据(Packet)和接收Dat ...

  2. C++子类虚函数表指针

    最近看剑指offer,记录一下 #include <iostream> #include <string> #include <cctype> #include&l ...

  3. 红帽RHCE培训-课程1笔记内容

    ssh -X root@s0 1.环境变量 env 系统变量名都为大写; 引用变量名对应的值时使用$引导: SHELL下,修改变量临时生效. # PS1=' # ' # echo $PS1 永久生效放 ...

  4. 从csv文件里取数据作为请求参数,和把返回数据放到一个csv文件

    本来想把登陆后的token放到数组里,下一个参数用,但是貌似不支持数组,暂时先这样用了,并不麻烦,还很方便. 1.添加线程组等必要的东东后,添加csv配置器 2.进行设置 说明:csv文件设置不能读取 ...

  5. cmake 的使用

    官网教程:https://cmake.org/cmake-tutorial/ 第一个简单的例子 源文件:tutorial.cpp // A simple program that computes t ...

  6. Yii2.0 连接数据库

    打开数据库配置文件common\config\main-local.php

  7. 将.NET Core Web Api发布到Linux(CentOS 7 64)

    将.NET Core(2.1) Web Api发布到Linux(CentOS 7 64) 近来在学习linux相关的一些东西,然后正巧想试一下把core的应用程序发布到Linux,毕竟跨平台.尝试一下 ...

  8. input type=range 进度条的自定义样式

    /* 自定义进度条样式 */ .v_my input[type=range] { -webkit-appearance: none;/*清除系统默认样式*/ width: .8rem; backgro ...

  9. JS-防抖与节流

    问题的由来:一些事件频繁的被触发而导致频繁的调用事件处理程序,从而造成程序不必要的开销,影响程序性能:防抖和节流就是为了解决这种情况造成的性能消耗. 场景1:使用keyup事件监听输入框的值进行请求搜 ...

  10. Leader:这样的 Bug 你也写的出来???

    Hello~各位读者新年好!不知道大家春节假期是否已延长,小黑哥刚接到通知,假期延长到 2 月 2 号,另外回去之后需要在家办公,自行隔离两周.还没试过在家办公,小黑哥就怕到时候生物钟还没调整过来,一 ...