1597: [Usaco2008 Mar]土地购买

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4023  Solved: 1470
[Submit][Status][Discuss]

Description

农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.

Input

* 第1行: 一个数: N

* 第2..N+1行: 第i+1行包含两个数,分别为第i块土地的长和宽

Output

* 第一行: 最小的可行费用.

Sample Input

4
100 1
15 15
20 5
1 100

输入解释:

共有4块土地.

Sample Output

500

HINT

FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.

 

【分析】

  刚开始没什么思路,但后开就突然开窍了,就是把每块土地的长和宽看做平面直角坐标系里点的横纵坐标

  如下:

  那么如果你要单独购买一块土地,就是作一个长和宽分别等于这个点的横纵坐标的矩形,其面积就是你要付的费用,我们可以规定矩形的左下角为(0,0),右上角就是这个点。

  如果要购买一组土地,题目里说是长和宽分别取最大值然后乘起来,对应到坐标系里就是选最右边的点的横坐标乘以最上边的点的纵坐标。如下:


 

  那么问题就变成了使用面积和最小的若干个矩形(左下角都是(0,0))将所有的点都覆盖。如下是一种随便绘制的方案:


 

  不难发现,如果一个点的横纵坐标都小于另一个点,那么这个点的存在就是没有意义的。因为不管用何种方案把横纵坐标都较大的点覆盖时,这个横纵坐标都较小的点一定被覆盖了。而你的目的是覆盖所有的点,所以这些横纵坐标都较小的点存不存在是不会影响答案的。如下:


 

  我们把这样的点(a,b)叫做红点:存在另一个点(x,y),满足a<=x且b<=y;

  把这样的点(a,b)叫做蓝点:对于其它所有的点(x,y),满足a>x或b>y

  当我们按照定义把点分类并且把红色的点去掉时,发现剩下的点在一个严格单调下降函数的图像上,如下:


 

  为了方便研究,使用另一张图,如下:

  根据蓝点的定义,可以证明这些蓝点在一个严格单调下降函数图像上。

  然而这会有没思路了。。。。

  回到开始,我们要用面积最小的矩形把这些点覆盖,先随便找几个点,比如我要买图中的第3个点和第6个点所对应的土地,那么我们把它们用矩形框起来。然后我们发现两个东西:

  第一:如果要把第i和第j个点框起来,那么中间所有的点都一定被框在里面了(因为单调下降)

  第二:框起第i个到第j个点的代价是第i个点的纵坐标乘上第j个点的横坐标(因为单调下降)

  如下:
 

 

  如果有两个矩形重叠了,比如两个矩形覆盖的点的编号分别是a~b,c~d,其中a<c<b<d那么由单调性可以证明选择a~c,b~d这种方案一定更优,如果一个矩形完全在另一个矩形内部,那你可以直接舍弃这个较小的矩形。

  综上,在最优解中,所有矩形所覆盖的点构成一些不相交的区间。如下是一种随便绘制的方案:

  用f[i]表示覆盖掉前i个点的最小费用,那么进行划分dp,方程为:

  f[i]=min(f[j]+w(j+1,i)),(j<i)

  其中w(j+1,i)表示覆盖第j+1个点到第i个点的费用

  时间复杂度O(N^2)

【优化】

  用w(i,j)表示覆盖第i~j个点的费用,那么w(i,j)=y[i]*x[j]。

  由单调性有y[i+1]<y[i],x[i+1]>x[i],恒成立

  w(i,j)=y[i]*x[j]

  w(i+1,j+1)=y[i+1]*x[j+1]

  w(i+1,j)=y[i+1]*x[j]

  w(i,j+1)=y[i]*x[j+1]

  作差:

  [
w(i,j)+w(i+1,j+1) ] - [ w(i+1,j)+w(i,j+1) ]

=  
 y[i]*(x[j]-x[j+1]) + y[i+1]*(x[j+1]-x[j])

=  
 (y[i]-y[i+1])(x[j+1]-x[j]) <0恒成立

  所以w(i,j)+w(i+1,j+1) < w(i+1,j)+w(i,j+1)恒成立

  所以此dp具有决策单调性

显然f[i]=min(f[j]+y[j+1]x[i])

然后再搞个斜率优化

方程是(f[j]-f[k])/(y[k+1]-y[j+1])<x[i]

然后维护一个下凸包

#include<cstdio>
#include<algorithm>
#define ll long long
#define DB double
using namespace std;
ll read(){
register ll x=;bool f=;
register char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return f?x:-x;
}
const int N=5e4+;
struct node{
int x,y;
bool operator < (const node &b)const{
return x==b.x?y<b.y:x<b.x;
}
}a[N];
ll x[N],y[N],f[N];
int n,tot,q[N];
DB slop(int a,int b){
return (DB)(f[b]-f[a])/(y[a+]-y[b+]);
}
int main(){
n=read();
for(int i=;i<=n;i++) a[i].x=read(),a[i].y=read();
sort(a+,a+n+);
for(int i=;i<=n;i++){
for(;tot&&a[i].y>=y[tot];tot--);
x[++tot]=a[i].x;y[tot]=a[i].y;
}
int l=,r=;
for(int i=;i<=tot;i++){
for(;l<r&&slop(q[l],q[l+])<x[i];l++);
f[i]=f[q[l]]+y[q[l]+]*x[i];
for(;l<r&&slop(q[r],i)<slop(q[r-],q[r]);r--);
q[++r]=i;
}
printf("%lld",f[tot]);
return ;
}

1597: [Usaco2008 Mar]土地购买的更多相关文章

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

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

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

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

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

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

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

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...

  5. 1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ] 未完

    传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1979  Solved: 705[Subm ...

  6. 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597 题意: 有n块矩形土地,长为a[i],宽为b[i]. FJ想要将这n块土地全部买下来 ...

  8. bzoj 1597: [Usaco2008 Mar]土地购买

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

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

    [算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs. ...

随机推荐

  1. jvm系列(五):tomcat性能调优和性能监控(visualvm)

    tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...

  2. Oracle数据加载之外部表的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...

  3. 完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程

    本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程. 1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功 1.OPa ...

  4. [spring]03_装配Bean

    3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...

  5. 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作

    一.reindex() 方法:重新索引 针对 Series   重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...

  6. Pyc 是什么东东

    在众多语言中, 最终我们可以将语言分为编译性语言和解释性语言两种 编译性语言,也就是机器语言, 是机器能读的懂的语言, 像C语言, 其实高级语言都是基于C语言的基础之上运行的 解释性语言, 不同于编译 ...

  7. O365(世纪互联)SharePoint 之调查列表简单介绍

    前言 SharePoint中为了提供了很多开箱即用的应用程序,比如调查列表就是其中之一,同样,在O365版本里(国际版和世纪互联版本均可),也有这样的调查列表可以供我们使用,而使用起来非常方便和快速, ...

  8. 你必须知道的HTTP错误

    发送网络请求有时失败,分析一下响应行,在响应的响应行内,你会发现响应行由三部分组成,用空格来隔开,HTTP/1.1 404 NOT FOUND,第一个是响应的HTTP的版本,第二个和第三个是状态值. ...

  9. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  10. iOS UIApplication sharedapplication用法

    应用中打开其他应用 我们来讨论一下,在iOS开发中,如何实现从app1打开app2. 基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一 ...