原题

农夫John准备扩大他的农场,他正在考虑N块长方形的土地. 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.


首先,我们发现有一些矩形是没有用的!(假如他的x和y都比另一个矩形小)然后我们把它删掉!
我们就得到了x升序,y降序的矩阵序列

显然是dp
n^2的dp:
dp[i]表示买完前i块土地的最小花费

//按x坐标sort
for (int i=1;i<=n;i++)for (int j=1;j<i;j++)dp[i]=min(dp[i],dp[j]+x[i]*y[j+1]);

怎么优化呢?
假如i可以由j和k转移过来,而j状态比k状态优,那么
\(dp[j]+x[i]*y[j+1]<dp[k]+x[i]*y[k+1]\)
移项为\(dp[j]-dp[k]<x[i]*(y[k+1]-y[j+1])\)
再除过去得到\((dp[j]-dp[k])/(y[k+1]-y[j+1])<x[i]\)
然后维护单调队列即可!(如果j比k优,那么k能更新的j都能更新)

#include<cstdio>
#include<algorithm>
#define N 50010
typedef long long ll;
using namespace std;
struct hhh
{ll x,y;bool operator < (const hhh &b) const{if (x==b.x) return y<b.y;return x<b.x;}
}a[N];
ll n,tot,x[N],y[N],q[N],f[N],l,r;ll read()
{ll ans=0,fu=1;char j=getchar();for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';return ans*fu;
}   double check(ll i,ll j)
{return 1.0*(f[j]-f[i])/(y[i+1]-y[j+1]);
}int main()
{freopen("buy.in","r",stdin);freopen("buy.out","w",stdout);n=read();for (ll i=1;i<=n;i++) a[i].x=read(),a[i].y=read();sort(a+1,a+n+1);for (ll i=1;i<=n;i++){while (tot && a[i].y>=y[tot]) tot--;x[++tot]=a[i].x;y[tot]=a[i].y;}for (ll i=1;i<=tot;i++){while (l<r && check(q[l],q[l+1])<x[i]) l++;f[i]=f[q[l]]+y[q[l]+1]*x[i];while (r>l && check(q[r],i)<check(q[r-1],q[r])) r--;q[++r]=i;}printf("%lld\n",f[tot]);return 0;
}

转载于:https://www.cnblogs.com/mrha/p/8392812.html

[bzoj] 1597 土地购买 || 斜率优化dp相关推荐

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

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

  2. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  3. bzoj 1597 土地购买

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

  4. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

    4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...

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

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

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

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

  7. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  8. 【总结】斜率优化DP

    于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...

  9. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

最新文章

  1. 超越梦想,追求卓越——图灵五周年生日聚会圆满成功
  2. mysql cluster 读写分离_mysql数据库集群实现高可用读写分离_一点课堂(多岸学院)...
  3. Orm框架之XUtils简单使用
  4. dataAdapter与dataSet和dataTable的填充
  5. 77 ~And, two stars meet again~ RC汉化补丁[BUG修正]
  6. linux后台执行shell脚本
  7. eos操作系统_【EOS币资讯】EOS币与以太坊有什么不同?
  8. 十大java视频学习网站
  9. JDY-31蓝牙模块简单通信
  10. Python探路-多重继承
  11. c语言求int的最大值最小值,c语言 int最大值是多少?
  12. 计算某天是星期几-泽勒算法
  13. 数据库--根据日期查询
  14. 钓鱼篇-CHM电子书上线CS
  15. python tokenize_python – 滥用nltk的word_tokenize(已发送)的后果
  16. 闲鱼平台API,item_app获得闲鱼原生数据
  17. linux man命令如何翻页,如何在Linux中使用man帮助使用man命令
  18. Oracle 入门初学者安装(一)。
  19. 关于过圣诞节的一段往事
  20. 公积金网厅显示连接服务器错误,住房公积金网厅解决方案

热门文章

  1. linux解压该文件,linux上解压缩文件
  2. mc是用java写的吗_都说MC的代码特别差劲,你觉得它在所有游戏中,能排第几?...
  3. MatrikonOPC与西门子S7300系列PLC以太网通讯
  4. Save More Mice (贪心 二分)
  5. win7修改计算机名访问被拒绝访问,今天解答win7无法更改注册表拒绝访问的解决介绍...
  6. 目前使用计算机的内存和外存,简述计算机内存和外存区别及常用外存有哪些
  7. R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)
  8. 站在招聘者角度看面试 | 掘金技术征文
  9. 利用Python绘制柱形图或堆积柱形图
  10. keil5 c语言函数库,C语言中KeilC51库函数大全.doc