题目传送门

1597: [Usaco2008 Mar]土地购买

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5925  Solved: 2243
[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
FJ分3组买这些土地:
第一组:100x1,
第二组1x100,
第三组20x5 和 15x15 plot.
每组的价格分别为100,100,300, 总共500.

HINT

Source

Gold

  首先我们看到每组选择的土地可以是不连续的,这给我们造成了不小的麻烦。

  我们思考一下题意,可以发现若一个矩形的长和宽都不大于另一个矩形的长和宽,那么这个矩形就不用考虑了。

  怎么删除这些无用矩形呢?

  我们先按长为第一关键字,宽为第二关键字进行降序排序,然后就可以比较轻松地删去无用矩形。

  而且我们可以发现最后得到的序列的长单调递减,宽单调递增。也就是说如果选其中两个矩形为一组,序列中位于这两个矩形中间的矩形都是可以免费加入改组的。所以每一组的区间就是连续的。

  于是我们就可以用f[i]表示购买前i块土地的最小花费。转移方程为f[i] = min{f[j]+l[j+1]*r[i]}.

  但这样转移复杂度是O(n^2)的,还是不满足数据要求。

  所以我们考虑斜率优化。状态转移复杂度优化为O(n).  (还没学习斜率优化的同学可以看一下大米饼的博客,强烈推荐。传送门)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define LL long long
 6 #define RI register int
 7 using namespace std;
 8 const int INF = 0x7ffffff ;
 9 const int N = 50000 + 10 ;
10
11 inline int read() {
12     int k = 0 , f = 1 ; char c = getchar() ;
13     for( ; !isdigit(c) ; c = getchar())
14       if(c == '-') f = -1 ;
15     for( ; isdigit(c) ; c = getchar())
16       k = k*10 + c-'0' ;
17     return k*f ;
18 }
19 struct data {
20     LL l, r ;
21 }gg[N], hh[N] ;
22 int n ; int q[N] ; LL f[N] ;
23
24 inline double X(int i) { return -hh[i+1].l ; }
25 inline double Y(int i) { return f[i] ; }
26 inline double Rate(int i,int j) { return (Y(j)-Y(i))/(X(j)-X(i)) ; }
27
28 inline bool cmp1(data s,data t) { return s.l == t.l ? s.r > t.r : s.l > t.l ; }
29 int main() {
30     n = read() ;
31     for(int i=1;i<=n;i++) gg[i].l = read(), gg[i].r = read() ;
32     sort(gg+1,gg+n+1,cmp1) ; int tt = 0 ;
33     for(int i=1;i<=n;) {
34         hh[++tt] = gg[i] ;  int j=i+1 ;
35         while(gg[j].l <= gg[i].l && gg[j].r <= gg[i].r) j++ ;
36         i = j ;
37     }  n = tt ;
38     int head = 1, tail = 1 ; q[1] = 0 ;
39     for(int i=1;i<=n;i++) {
40         while(head < tail && Rate(q[head],q[head+1]) < hh[i].r) head++ ;
41         int j = q[head] ; f[i] = f[j]+hh[j+1].l*hh[i].r ;
42         while(head < tail && Rate(q[tail-1],q[tail]) > Rate(q[tail],i)) tail-- ;
43         q[++tail] = i ;
44     }
45     printf("%lld",f[n]) ;
46     return 0 ;
47 }

转载于:https://www.cnblogs.com/zub23333/p/8818956.html

土地购买[Usaco2008 Mar]相关推荐

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

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

  2. bzoj1597[Usaco2008 Mar]土地购买

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

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

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

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

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

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

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

  6. 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机

    1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: ...

  7. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]

    1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...

  8. bzoj 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机

    1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: ...

  9. bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(BFS)

    1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1293  Solved ...

  10. bzoj 1617: [Usaco2008 Mar]River Crossing渡河问题(DP)

    1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1077  Solved: ...

最新文章

  1. Android Json解析方法
  2. The NVIDIA driver on your system is too old
  3. C++ 中判断非空的错误指针
  4. mysql与java连接查询_【java】MySQL数据库之连接查询
  5. gcc 编译错误:undefined reference to 'sqrt'
  6. 《Objective-c》-(内存管理之三:@property的内存管理)
  7. DroidPlugin插件化开发
  8. 在DialogFragment中显示大图片
  9. mysql 5.7日志配置_mysql-5.7日志设置
  10. 《Linux Shell脚本攻略》读书笔记第三章 以文件之名
  11. 职称计算机 将计算机broad_1下的e盘映射为k盘网络驱动器,计算机职称考试题目(网络基础答案)...
  12. 如何制作互联网区块链PPT模板?
  13. Day10.事件下(学习日记10)
  14. 计算机辅助设计技术领域的应用,关于计算机辅助设计技术在规划设计中的应用...
  15. smart3D、acute3D、three3D等技术网页浏览3D模型注意事项
  16. win10麦克风说话没声音_电脑录屏,真的没那么麻烦
  17. 按键精灵设置界面居中显示
  18. 微信小程序——运行他人的项目、寻找appid
  19. SSH服务器拒绝了密码,请再输入一次(解决方法)
  20. 论文中遇到的arg是啥意思?

热门文章

  1. 一个开源知识管理系统,满足企业定制化需求
  2. 密西根州立大学计算机qs分数,密歇根州立大学商科排名怎么样?2021年密歇根州立大学QS商科硕士排名商业分析硕士专业排名第20...
  3. Qt QLabel的修改形状显示圆形
  4. 怎么设置台式计算机密码忘了,台式电脑忘记开机密码怎么办
  5. 苹果电脑忘记开机密码重设教程
  6. 三星堆的青铜机器人_身穿“燕尾服”的青铜大立人是谁?探秘三星堆,从这些自带神秘光环的宝藏开始...
  7. 运营老鸟眼中,“用户分层”真的超级简单!
  8. python批量发送邮件_EDM营销算法:python自动批量发邮件
  9. Appdata\Local Roaming LocalLow文件夹
  10. 无人机pid调节顺口溜