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. 不起眼,但是足以让你收获的JVM内存案例

    今天的这个案例我觉得应该会让你涨姿势吧,不管你对JVM有多熟悉,看到这篇文章,应该还是会有点小惊讶的,不过我觉得这个案例我分享出来,是想表达不管多么奇怪的现象请一定要追究下去,会让你慢慢变得强大起来, ...

  2. 关于为什么使用React新特性Hook的一些实践与浅见

    前言 关于Hook的定义官方文档是这么说的: Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 简单来说,就是在 ...

  3. keil(MDK)错误记录

    1.a parameter list without types is only allowed in a function definition(没有类型的参数列表只允许在函数定义中使用) 2.Er ...

  4. java 多线程并发问题

    问题:50个线程,先查询数据库的一个记录 t,然后对这个记录+1,最后更新到数据库 (更新的时候,不允许使用 update  test_concurrent set sum =sum -1 where ...

  5. wordpress 不用插件添加友情链接

    哎,也不知道为啥,网上说的那个link manager这个插件死活找不到啊, 找了一个类似的,但是不是,这么多的英文看了好几遍才发现不是 然后从大神哪里找到一个好方法 在你用的那个主题的functio ...

  6. 【C语言】计算N名同学的某门功课的平均成绩

    分析: 循环输入number只童鞋的成绩,累加为sum,最后输出sum/number即可! 代码: #include<stdio.h> int main() { , score;//sco ...

  7. [linux] ARCH LINUX 常见问题及实用工具汇总

    1.办公 screen-recorder 1)深度linux桌面录制软件(不支持录音),操作简单,可以保存mp4和gif格式 2)命令安装:sudo pacman -S deepin-screen-r ...

  8. 解决 IDEA 下 struts.xml 中 extends="struts-default" 报红的问题

    现象 在IDEA中配置struts.xml时 extends="struts-default" 报红,配置拦截器时属性无预选项提示,也爆红. struts.xml本身的配置并没有错 ...

  9. numpy中的max()函数

    1.ndarray.max([int axis]) 函数功能:求ndarray中指定维度的最大值,默认求所有值的最大值. axis=0:求各column的最大值 axis=1:求各row的最大值

  10. cemtos安装python

    mkdir python3cd python3/yum -y install gcc*yum install zlib-devel bzip2-devel openssl-devel ncurses- ...