[bzoj] 1597 土地购买 || 斜率优化dp
原题
农夫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相关推荐
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- BZOJ 2149 拆迁队 斜率优化DP 主席树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...
- bzoj 1597 土地购买
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 < = 1,000 ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- 【BZOJ1597】【Tyvj2461】土地购买,第一次的斜率优化DP
传送门1 传送门2 写在前面:看了好久斜率优化DP,感觉还是不太懂 思路: (受大牛博文启发) 1.除去无效边,li>=lj且ri>=rj,则j可以直接扔掉不要.因此我们可以按l或r排一下 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- 【总结】斜率优化DP
于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...
- NOI2007 货币兑换 - CDQ分治斜率优化dp
斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...
最新文章
- 超越梦想,追求卓越——图灵五周年生日聚会圆满成功
- mysql cluster 读写分离_mysql数据库集群实现高可用读写分离_一点课堂(多岸学院)...
- Orm框架之XUtils简单使用
- dataAdapter与dataSet和dataTable的填充
- 77 ~And, two stars meet again~ RC汉化补丁[BUG修正]
- linux后台执行shell脚本
- eos操作系统_【EOS币资讯】EOS币与以太坊有什么不同?
- 十大java视频学习网站
- JDY-31蓝牙模块简单通信
- Python探路-多重继承
- c语言求int的最大值最小值,c语言 int最大值是多少?
- 计算某天是星期几-泽勒算法
- 数据库--根据日期查询
- 钓鱼篇-CHM电子书上线CS
- python tokenize_python – 滥用nltk的word_tokenize(已发送)的后果
- 闲鱼平台API,item_app获得闲鱼原生数据
- linux man命令如何翻页,如何在Linux中使用man帮助使用man命令
- Oracle 入门初学者安装(一)。
- 关于过圣诞节的一段往事
- 公积金网厅显示连接服务器错误,住房公积金网厅解决方案
热门文章
- linux解压该文件,linux上解压缩文件
- mc是用java写的吗_都说MC的代码特别差劲,你觉得它在所有游戏中,能排第几?...
- MatrikonOPC与西门子S7300系列PLC以太网通讯
- Save More Mice (贪心 二分)
- win7修改计算机名访问被拒绝访问,今天解答win7无法更改注册表拒绝访问的解决介绍...
- 目前使用计算机的内存和外存,简述计算机内存和外存区别及常用外存有哪些
- R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)
- 站在招聘者角度看面试 | 掘金技术征文
- 利用Python绘制柱形图或堆积柱形图
- keil5 c语言函数库,C语言中KeilC51库函数大全.doc