[BZOJ1597]土地购买

题面

农夫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
FJ分3组买这些土地:
第一组:100x1,
第二组1x100,
第三组20x5 和 15x15 plot.
每组的价格分别为100,100,300, 总共500.

思路

很显然,如果土地A被土地B包含,那么我们可以直接舍弃土地A不管。考虑如何判断包含关系。

先将所有土地按照长度从大到小排序。然后依次把土地放入一个新数组。需要注意的是,如果当前放入的土地的宽度小于等于数组中的最后一块土地,那么就可以直接舍弃当前土地,不用放入数组(被包含)。

那么观察一下我们得到的新数组,发现其长度是单调递减的,宽度是单调递增的。那么我们可以很容易的想到状态转移方程:
\[ f[i]=min(f[j]+length[j+1]*width[i]),1 \leq j < i \]
直接暴力转移复杂度\(O(n^2)\)肯定是要炸的。考虑使用斜率优化:
\[ 令x=width[i],k=length[j+1],b=f[j] \\f[j]+length[j+1]*width[i]=kx+b \]
所以问题就转化为了作一条直线\(x=f[i]\),求所有直线与之交点中纵坐标最小的那一个点。

总结一下,斜率优化必须符合这几个条件:

  • k具有单调性
    //未完待续

代码

注意,每次while(...){head++;}之后的head不是找到的最优解\(j\)。而是线段对应的编号。因为可能舍去一些线段,所以线段对应的编号是小于等于线段对应的\(j\)的。

另外,写状态转移方程的时候取值范围应该保证\(<i\)而不是\(\leq i\)。因为我们是先查询再插入的,所以在查询时是取不到\(i\)的。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 55000
#define ll long long
struct line{ll k,b;
}l[maxn];
struct field{int wid,len;
}fie1[maxn],fie2[maxn];
int n,head=1,tail,cntn;
ll f[maxn];
bool cmp(field x,field y){if(x.len==y.len){return x.wid>y.wid;}return x.len>y.len;
}
bool calc(line l1,line l2,int c){return (double)(l1.b-l2.b)/(l2.k-l1.k)<=c;}
bool calc(line l1,line l2,line now){return(double)(l1.b-l2.b)/(l2.k-l1.k)>=(double)(l1.b-now.b)/(now.k-l1.k);}
int main(){//freopen("in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&fie1[i].wid,&fie1[i].len);sort(fie1+1,fie1+1+n,cmp);for(int i=1;i<=n;i++){if(fie1[i].wid>fie2[cntn].wid){fie2[++cntn]=fie1[i];}}n=cntn;l[++tail]=(line){fie2[1].len,0};//l[1].k=fie2[1].len;for(int i=1;i<=n;i++){while(head<tail&&calc(l[head],l[head+1],fie2[i].wid))head++;f[i]=l[head].k*fie2[i].wid+l[head].b;line now=(line){fie2[i+1].len,f[i]};while(head<tail&&calc(l[tail],l[tail-1],now))tail--;l[++tail]=now;}printf("%lld",f[n]);return 0;
}

转载于:https://www.cnblogs.com/GavinZheng/p/10948031.html

[BZOJ1597]土地购买相关推荐

  1. bzoj1597[Usaco2008 Mar]土地购买

    bzoj1597[Usaco2008 Mar]土地购买 题意: n块土地,现在要求把土地分成几份,每份费用为该份中土地长最大值和宽最大值成绩,要求最小费用.n≤5000 题解: 当一块土地长宽都比另一 ...

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

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

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

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

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

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

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

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

  6. 【bzoj1597】 土地购买

    http://www.lydsy.com/JudgeOnline/problem.php?id=1597 (题目链接) 题意 购买n个矩形,每块土地的价格是它的面积,但可以同时购买多快土地. 这些土地 ...

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

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

  8. bzoj1597 [Usaco2008 Mar]土地购买

    题目描述 题解: 我们可以考虑这样一种情况,有一块$10*10$的土地,还有一块$1*1$的土地. 当然将$1*1$的土地合到$10*10$的土地中了. 所以我们可以先按土地$x$值从大到小排序,然后 ...

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

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

  10. bzoj 1597 土地购买

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

最新文章

  1. switch日版有中文吗_任天堂switch国行和日版的区别
  2. MYSQL从节点延迟问题原因及解决
  3. 逆向工程核心原理学习笔记(十二):分析abex' crackme #1
  4. 翁同龢后人向上海博物馆捐赠两件重要家藏
  5. 每天一个Linux命令(17)--whereis命令
  6. php stmp 授权码问题,PHPmailer 使用网易126发送邮件的问题
  7. 双11专刊|云原生数据仓库AnalyticDB支撑双11,大幅提升分析实时性和用户体验
  8. Bootstrap 框架学习目录
  9. Linux 开发环境工具 下载网址大全
  10. USB闪存驱动器未显示在MacOS的Finder或磁盘工具上,是什么原因
  11. 微信小程序视频开发教程
  12. 初学者如何从零开始搭建一个阿里云数据库
  13. php微信h5支付demo,微信h5支付 demo-HTML5微信支付DEMO下载 最新版--pc6下载站
  14. 【富文本】wangeditor编辑器简单使用(自定义图片上传)
  15. abb机器人控制箱按键的作用_ABB机器人控制柜各个部件及作用介绍
  16. nodejs中生成uuid
  17. 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
  18. 库伯勒立撤倍加福三合一拉线编码器配置工具
  19. vray 2014的警告框
  20. 还不知道 YUV 是什么?科普一下

热门文章

  1. 天翎开源,是一种技术,更是一种信仰
  2. 基于低代码平台的OA系统,更灵活高效!
  3. 加勒比海盗海盗不雅镜头_土豆,海盗和……编程?
  4. 机器学习(七)白化whitening
  5. 情感日记:梦里花落知多少--记念我的大学
  6. 台式计算机有线无线网卡设置,电脑无线网卡如何使用 电脑外置无线网卡详细使用图文教程...
  7. auto semicolon insertion 自动分号补齐的坑
  8. 观史图馆之《中东列国历代疆域变化 青铜与古典时代》
  9. 中小学教师计算机培训心得,小学教师信息技术培训心得体会2篇
  10. 华南师范大学计算机学院保研,保研学霸专访