描述

  • 有 n(≤50000) 块 (Xi*Yi) 的土地. 一些土地的购买价格是这些土地中长的最大值乘宽的最大值 (长宽不可颠倒). 求购买所有土地的最小花费.
  • 将 n 个二元组 (x, y) 分组使每个组中的 max{x}*max{y} 的和最小.

分析

  • 这里土地的顺序是无所谓的, 所以凭直觉先按 x 升序排序.
  • 然后去除无用的土地, 即如果一块土地可以完全包含在另一块土地里, 这一块土地就不需要再考虑了(因为它可以和后者分在一组). 这一步可以用一个单调栈来实现.

  • 这时 x 递增, y 递减.

  • 得到转移方程 : 由 j->i(j < i), f[i]=f[j−1]+Xi∗Yjf[i] = f[j-1]+X_i*Y_j
  • 意义就在于 j 和 i 之间的土地的长不大于 XiX_i 而宽不大于 YjY_j.
  • O(n2)O(n^2)

  • 斜率优化 :
  • 如果 j < k, j 不比 k 差, 则 f[j−1]+Xi∗Yj≤f[k−1]+Xi∗Ykf[j-1]+X_i*Y_j≤f[k-1]+X_i*Y_k
  • 化简得到 Xi≤f[k−1]−f[j−1]Yj−YkX_i≤\frac{f[k-1]-f[j-1]}{Y_j-Y_k}
  • 设上式 f[k−1]−f[j−1]Yj−Yk=g(j,k)\frac{f[k-1]-f[j-1]}{Y_j-Y_k}=g(j,k)
  • 则如果 g(a,b)>g(b,c)g(a,b)>g(b,c) 则 b 可以完全被舍弃. 证明如下
    • 如果 g(a,b)≥Xig(a,b)≥X_i, 那么 a 优于 b.
    • 如果 g(a,b)<Xig(a,b), 那么 g(b,c)<Xig(b,c) c 优于 b.
  • 所以可以用一个单调队列来存储当前在考虑范围内的土地. 用队尾的两个结点和 i 的 XX 和 YY 的值来维护单调队列. 其实是判定队尾结点可不可以删除.
  • 而在更新 f[i]f[i] 的答案时, 则从队头选取. 如果 g(q[first],q[first+1])≥Xig(q[first], q[first+1]) ≥ X_i 说明队首元素是队列中的最优解(向后推就可以证明了). 否则 firstfirst 就应该从队列中删除, 因为此时 q[first+1]q[first+1] 比 q[first]q[first] 优, 在 i 变大时 XiX_i 也变大, 那么 g(q[first],q[first+1])<Xig(q[first], q[first+1]) 是一定成立的.
  • O(n∗logn)O(n*logn)

代码

https://code.csdn.net/snippets/647122

#include <cstdio>
#include <algorithm>
using namespace std;const int maxn = 50000 + 10;inline int getint() {int x = 0, f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x*10 + ch-'0';return x * f;
}struct Node {int x, y;bool operator < (const Node& rhs) const {if(x == rhs.x) return y < rhs.y;return x < rhs.x;}
} A[maxn];int q[maxn];
long long f[maxn];double g(int a, int b) {return (double)(f[b-1]-f[a-1]) / (A[a].y-A[b].y);
}int main() {freopen("acquire.in", "r", stdin);freopen("acquire.out", "w", stdout);int n = getint(), m;for(int i = 0; i < n; i++) {A[i].x = getint();A[i].y = getint();}sort(A, A + n);m = 0;for(int i = 0; i < n; i++) {while(m > 0 && A[m-1].y <= A[i].y) m--;A[m++] = A[i];}int first, last;first = last = 0;for(int i = 0; i < m; i++) {while(last-first > 1 && g(q[last-2], q[last-1]) > g(q[last-1], i)) last--;q[last++] = i;while(last-first > 1 && g(q[first], q[first+1]) < (double)A[i].x) first++;int j = q[first];f[i] = (long long)A[i].x * A[j].y + (j > 0 ? f[j-1] : 0);}printf("%lld\n", f[m-1]);return 0;
}

COGS-363-土地购买-斜率优化相关推荐

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

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

  2. [bzoj] 1597 土地购买 || 斜率优化dp

    原题 农夫John准备扩大他的农场,他正在考虑N块长方形的土地. 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. FJ ...

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

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

  4. 【bzoj1597- [Usaco2008 Mar]土地购买】斜率优化

    [597][Usaco2008 Mar]土地购买 [题目描述] 有N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000 ...

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

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

  6. 决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)

    决策单调性Ⅰ:四边形不等式: http://blog.csdn.net/jaihk662/article/details/78174717 决策单调性: 对于dp[i] = min(dp[i], dp ...

  7. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  8. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  9. 【BZOJ1597】【Tyvj2461】土地购买,第一次的斜率优化DP

    传送门1 传送门2 写在前面:看了好久斜率优化DP,感觉还是不太懂 思路: (受大牛博文启发) 1.除去无效边,li>=lj且ri>=rj,则j可以直接扔掉不要.因此我们可以按l或r排一下 ...

最新文章

  1. 斯洛文尼亚接受BCH支付的商家达343家,日本和北昆士兰州对BCH接受度增长迅速
  2. python安装勾选-Python的安装
  3. cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果
  4. 移除UTF-8文件头的BOM
  5. sql使用逻辑控制语句
  6. 数据结构-堆 Java实现
  7. 大数据分析技术未来发展会如何
  8. ACM 学习笔记(五) 动态规划
  9. removeAttribute与removeAttributeNode的区别
  10. hiho一下 第173周
  11. Python web实时消息服务器后台推送技术方案---GoEasy
  12. 硬核讲习,10名“悟道”核心成员,剖析大模型
  13. tomcat7 性能优化
  14. SpringBoot Mybatis 读写分离配置(山东数漫江湖)
  15. IDEA封神榜大语言模型二郎神系列Erlangshen-Ubert-110M-Chinese使用
  16. WPS表格excel实现下拉搜索(简单几步,轻松搞定)
  17. 大数据常用十种开发语言
  18. 牛客-小a与星际探索
  19. SplitSR: An End-to-End Approach to Super-Resolution on Mobile Devices
  20. vmware NSX 6.3.3 企业版序列号激活码密钥永久使用

热门文章

  1. [云炬创业管理笔记]第三章打造优秀创业团队讨论4
  2. 燃烧学往年精选真题解析
  3. Linux_unix系统编程手册以同步方式等待信号
  4. 编写图形界面程序,显示一个红色反弹球的程序,当该球撞击Applet边框时,它应从边框弹回并以相反方向45°运动。
  5. 锤子剪刀布 (20)
  6. 多组测试数据(求和)IV
  7. jquery_pagination分页插件的使用
  8. Markdown语法入门
  9. 使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
  10. layui.table.render设置自定义高度高度