BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597
题意:
有n块矩形土地,长为a[i],宽为b[i]。
FJ想要将这n块土地全部买下来。
土地可以分组购买。
若有某一些土地被分到了一组,则将这一组土地全部买下的花费为他们的max(a[i])*max(b[i])。
问你最小总花费是多少。
题解:
首先,如果一块土地能够被另一块土地完全包含(即长宽都比另一个小),那么被包含的那块土地可以忽略不计。
然后贪心地考虑如何使花费最小:
如果要使花费尽可能小,则分在同一组中矩形的长宽差距应尽可能地小。
所以将长a[i]作为第一关键字,将宽b[i]作为第二关键字排序。
此时矩形的长a[i]一定是非降的,那么对于两个矩形i和j(i<j),如果有b[i]<=b[j],则j一定能完全包含i。
利用这一特性将所有能被包含的矩形去掉。
此时矩形的宽b[i]就变成了严格递减的了。
显然,此时分到一组中的矩形必须是连续的一段区间,才有可能最优。
然后就可以dp了。
表示状态:
dp[i]表示已经购买了前i块土地的最小花费。
找出答案:
假设去掉能被包含的矩形之后,矩形总数为tot。
ans = dp[tot]
如何转移:
dp[i] = min dp[j] + a[i]*b[j+1]
边界条件:
dp[0] = 0
斜率优化:
设j < k,且k的决策更优。
则:dp[j] + a[i]*b[j+1] > dp[k] + a[i]*b[k+1]
整理得:(dp[k]-dp[j])/(b[j+1]-b[k+1]) < a[i]
所以slope(i,j) = (dp[i]-dp[j])/(b[j+1]-b[i+1])
由于a[i]非降,所以用单调队列维护下凸壳即可。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 50005 using namespace std; struct Rect
{
long long a,b;
Rect(long long _a,long long _b)
{
a=_a; b=_b;
}
Rect(){}
friend bool operator < (const Rect &x,const Rect &y)
{
return x.a!=y.a ? x.a<y.a : x.b<y.b;
}
}; int n;
int q[MAX_N];
long long dp[MAX_N];
Rect x[MAX_N]; void read()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>x[i].a>>x[i].b;
}
} inline double slope(int i,int j)
{
return (double)(dp[i]-dp[j])/(x[j+].b-x[i+].b);
} void work()
{
sort(x+,x++n);
int tot=;
for(int i=;i<=n;i++)
{
while(tot && x[i].b>=x[tot].b) tot--;
x[++tot]=x[i];
}
x[tot+]=Rect(,);
int l=,r=;
q[]=,dp[]=;
for(int i=;i<=tot;i++)
{
while(l<r && slope(q[l],q[l+])<=x[i].a) l++;
dp[i]=dp[q[l]]+x[i].a*x[q[l]+].b;
while(l<r && slope(q[r],i)<slope(q[r-],q[r])) r--;
q[++r]=i;
}
cout<<dp[tot]<<endl;
} int main()
{
read();
work();
}
BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp的更多相关文章
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...
- bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5524 Solved: 2074[Submit] ...
- bzoj1597 [Usaco2008 Mar]土地购买——斜率优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 就是斜率优化水题... 然而WA了十几遍,正负号处理真让人心累... 还是该负就负,别 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4989 Solved: 1847[Submit] ...
- 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...
- bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】
按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...
随机推荐
- 我的_vimrc文件
""""""""""""""""&quo ...
- Ext如何Gird中如何显示时间类型的列?
rt,后台bean中的字段属性是Date类型,前台的model中的字段属性也设置为date类型,但是还是显示不出来,如何解决呢? 直接代码: grid中的COLUMN: Model中的定义:
- Redis源码阅读-Adlist双向链表
Redis源码阅读-链表部分- 链表数据结构在Adlist.h Adlist.c Redis的链表是双向链表,内部定义了一个迭代器. 双向链表的函数主要是链表创建.删除.节点插入.头插入.尾插入. ...
- android 小游戏之数字猜猜
http://www.cnblogs.com/whatbeg/p/4152333.html
- python函数-------python2.7教程学习【廖雪峰版】(三)
任务: 看完函数这一章 已完成 2017年6月8日16:23:491.函数的作用:写较少的代码实现较多的功能,可以多次被调用.2.可见,借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的 ...
- Unity3d 摇杆奖励
单个单元: publicclass RockerSingle : MonoBehaviour { // 枚举.类别 RockerType rockerType; //是否有效,最上面的为无效,即为f ...
- centos7.0 安转apache2.4
安装apache2.4的需要安转apr和apr-util 包 APR和APR-util的下载地址 http://apache.fayea.com//apr/apr-1.6.2.tar.gzhttp:/ ...
- [转]jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别
转自:http://www.cnblogs.com/keyi/p/5933981.html jquery中innerWidth(),outerWidth(),outerWidth(true)和wi ...
- http => https 升级
准备证书 阿里云安全(云盾)-> CA证书服务,购买证书,个人测试的话可以使用免费的,期限1年. 购买证书后,把域名与证书进行绑定,提交审核,大概10分钟左右,正常情况下审核就可以通过.证书准备 ...
- EF之POCO应用系列2——复杂类型
在.NET开发中,EF4以前的版本以及LINQ TO SQL都不支持complex数据类型,EF4终于支持complex类型的数据了,这意味着微软的EF框架朝领域驱动方面又迈了一大步. 复杂的数据类型 ...