P2900 [USACO08MAR]土地征用Land Acquisition

题目描述

约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地。如果约翰单买一块土 地,价格就是土地的面积。但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽。比如约翰并购一块3 × 5和一块5 × 3的土地,他只需要支付5 × 5 = 25元, 比单买合算。 约翰希望买下所有的土地。他发现,将这些土地分成不同的小组来并购可以节省经费。 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用。

输入输出格式

输入格式:

  • Line 1: \(A\) single integer: \(N\)

  • Lines 2..\(N+1\): Line \(i+1\) describes plot \(i\) with two space-separated integers: \(width_i\) and \(length_i\)

输出格式:

  • Line 1: The minimum amount necessary to buy all the plots.

说明:

\(1<=N<= 50,000,1<= width_i <= 1,000,000,1<=length_i<=1,000,000\)


不裸的斜率优化。

发现如果做动态规划,我们并没有一个明显的转移顺序。

我们思考发现当一个矩形的长和宽都被可以被别的覆盖掉时,我们可以不考虑它。

如果把横纵坐标分别设为长和宽,那么一个点可以覆盖掉它与原点构成的矩形中的点。

这样的话,在坐标上剩下的点一定是横坐标递增,纵坐标递减的一个点集。

对于这个点集,我们就可以按横坐标做DP了,因为如果覆盖大的区间,小的区间也一定会被覆盖。

设\(dp[i]\)表示买下了前\(i\)块土地的最小花费。

则转移为:\(dp[i]=min_{0 \le j < i} dp[j]+x[i]*y[j+1]\)

套上斜率优化即可


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int N=50010;
ll dp[N];
int n,s[N],tot,q[N],l,r;
pair <ll,ll> dx0[N],dx[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&dx0[i].first,&dx0[i].second);
sort(dx0+1,dx0+1+n);
for(int i=1;i<=n;i++)
{
while(tot&&dx0[s[tot]].second<=dx0[i].second) tot--;
s[++tot]=i;
}
for(int i=1;i<=tot;i++)
dx[i]=dx0[s[i]];
l=r=1;
for(int i=1;i<=tot;i++)
{
while(l<r&&(-dx[i].first)*(dx[q[l+1]+1].second-dx[q[l]+1].second)>=dp[q[l+1]]-dp[q[l]]) l++;
dp[i]=dp[q[l]]+dx[i].first*dx[q[l]+1].second;
while(l<r&&(dp[i]-dp[q[r]])*(dx[q[r]+1].second-dx[q[r-1]+1].second)
>=(dp[q[r]]-dp[q[r-1]])*(dx[i+1].second-dx[q[r]+1].second)) r--;
q[++r]=i;
}
printf("%lld\n",dp[tot]);
return 0;
}

2018.7.21

最新文章

  1. Atitit 管理原理与实践attilax总结
  2. [LintCode] Min Stack 最小栈
  3. depot用例视图建模
  4. bash操作小结
  5. hdu 1303 Doubles
  6. 自己的一个LESS工具函数库
  7. 2016/01/10 C++ Primer 小记 —— 命令行编译环境配置
  8. QT:窗口最小化时显示一个小浮标
  9. Hive环境搭建心得(Ubuntu)
  10. Windows server 2008 r2上安装MySQL
  11. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用
  12. php连接memcahed出现Cannot assign requested address (99)的解决方法
  13. CentOS 编译安装 Nodejs (实测 笔记 Centos 7.3 + node 6.9.5)
  14. python迭代-如何实现反向迭代
  15. php实现ZIP压缩文件解压缩
  16. oracle小记:dba_data_files
  17. ckeditor5 增加居中alignment
  18. 探讨CAN总线的抗干扰能力
  19. hdoj 1698 Just a Hook 【线段树 区间更新】
  20. Java并发(十六):并发工具类——Exchanger

热门文章

  1. Firefox开发
  2. Siki_Unity_2-4_UGUI_Unity5.1 UI 案例学习
  3. CentOS7.2 部署Haproxy 1.7.2
  4. Open vSwitch for CentOS
  5. Kafka安装之三 spring-kafka实践
  6. 深入react技术栈解读
  7. hbase优化操作与建议
  8. Scrum立会报告+燃尽图(十月十七日总第八次):分配Alpha阶段任务
  9. Thunder——互评beta版本
  10. 基础系列(6)—— C#类和对象