【BZOJ】1597 [Usaco2008 Mar]土地购买
【算法】DP+斜率优化
【题意】n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价。
【题解】
斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html
因为对于土地x和y,若满足a[x]<=a[y]&&b[x]<=b[y],则x土地可无条件包含在y土地中,所以x土地可以忽略。
于是对长度从小到大排序,第二关键字对宽度从小到大排序,处理掉可被包含块。
则有a严格升序,b严格降序。
然后就是常规DP。
状态转移方程:f[i]=min(f[j]+a[i]*b[j+1])(j:0~i-1)
O(n^2)的效率显然不足,考虑斜率优化。
下面只从代数上理解斜率优化。
阶段i时对于决策j和k (j<k),当k更优时满足:
f[j]+a[i]*b[j+1]>f[k]+a[i]*b[k+1]
即(f[j]-f[k])/(b[k+1]-b[j+1])<a[i]
令d(j,k)=(f[j]-f[k])/(b[k+1]-b[j+1]),
当d(j,k)<a[i]时,k决策优于j决策,决策的位置就会往后移;当d(j,k)>a[i]时,j决策优于k决策,决策的位置就会往前移。
我们认为d(j,k)越小越容易把决策往后送,定义为更优,也就是斜率越小越优。
于是维护一个决策队列,队列严格要求两两之间的d从最优到最劣,因为a[i]递增,当有一个新的a[i]时,前面的d(j,k)小的把决策后推,直到遇到大的就停下来,确定了最优决策。
为什么要维护决策队列的d从最优到最劣?设决策j,k,l(j<k<l),因为若有d(j,k)>d(k,l),当a[i]<d(k,l)时,j>k>l,当d(k,l)<a[i]<d(j,k)时,j>k&&l>k,当a[i]>d(j,k)时,l>k>j。可以发现,无论何时决策k都不会被选择,故应当删去。
斜率不是真实的,它只是比较优劣的工具,决策的优劣只与a[i]有关,而斜率只是比较两决策优劣与a[i]的关系。
但是我们为什么要定义斜率的优劣?因为右项a[i]单调递增。
所以删去k后,j和l之间会出现新的斜率,当a[i]和这个斜率发生大小变化时,j或l的选择将会改变。
整个过程可以想象成维护下凸包,不再赘述。
斜率优化题目的通法:
1.分离:列出决策优劣比较式(i阶段,j<k且k更优时),分离i和j k,当i有关变量呈现单调性质时可以进行斜率优化,根据不等关系定义斜率的优劣,维护从最优到最劣的决策队列。
2.决策:选取队头两个决策d(head,head+1),若d满足优劣式说明k更优,删除队头j,继续比较;若d不满足优劣式说明j更优,则j为当前最优决策。
3.入队:选取队尾两个决策d1(tail-1,tail)和当先决策与队尾决策的d2(tail,i),若d2优于d1则删除队尾,继续比较,直到d2劣于d1就把i入队。
【注意】long long=1ll*int*int,记得类型转换……。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
long long f[maxn];
int q[maxn],n;
struct cyc{int x,y;}a[maxn],b[maxn];
bool cmp(cyc a,cyc b)
{return a.x<b.x||(a.x==b.x&&a.y<b.y);}
double d(int j,int k)
{return (f[j]-f[k])/(a[k+].y-a[j+].y);}//1.0*
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d%d",&b[i].x,&b[i].y);
sort(b+,b+n+,cmp);
int m=;a[]=b[];
for(int i=;i<=n;i++)
{
while(b[i].y>=a[m].y&&m>)m--;
a[++m]=b[i];
}
n=m;
// for(int i=1;i<=n;i++)printf("%d %d\n",a[i].x,a[i].y);
// f[0]=a[0].x=a[0].y=0;
int head=,tail=;q[]=;
for(int i=;i<=n;i++)
{
while(tail-head>=&&d(q[head],q[head+])<a[i].x)head++;
f[i]=f[q[head]]+1ll*a[i].x*a[q[head]+].y;
// printf("f[%d]=%lld\n",i,f[i]);
while(tail-head>=&&d(q[tail-],q[tail-])>d(q[tail-],i))tail--;//ÕâÑùÉèÖöÓÁУ¬tail´¦Ã»ÓÐÊý×Ö¡¡
q[tail++]=i;
}
printf("%lld",f[n]);
return ;
}
【BZOJ】1597 [Usaco2008 Mar]土地购买的更多相关文章
- 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 + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长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] ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...
- 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time ...
- BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597 题意: 有n块矩形土地,长为a[i],宽为b[i]. FJ想要将这n块土地全部买下来 ...
- bzoj 1597: [Usaco2008 Mar]土地购买
Description 农 夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000 ...
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- bzoj 1597: [Usaco2008 Mar]土地购买【斜率优化】
按xy降序排序,把能被完全包含的去掉 然后就得到了x升序y降序的一个数组 然后方程就显然了:f[i]=min(f[j]+y[j+1]x[i]) 斜率优化转移 说起来我还不会斜率优化呢是不是该学一下了 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 动态规划 + 斜率优化
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define x(i) (b[i+1]) ...
随机推荐
- 配置resin web方式部署项目
写在前面,推荐下载resin4.0.47版本.其它版本没有测试 最近打算做一个小项目,然后容器选用了resin.想通过web提交war文件的方式 进行部署,更新代码也方便. 试了resin最新的版本( ...
- Objective-C Json转Model(利用Runtime特性)
封装initWithNSDictionary:方法 该方法接收NSDictionary对象, 返回PersonModel对象. #pragma mark - 使用runtime将JSON转成Model ...
- css3 关于文字,字体属性(转载)
1.text-overflow属性(实现省略号效果) text-overflow用来设置是否使用一个省略标记(…)标示对象内文本的溢出. [语法] ❤text-overflow只是用来说明文字溢出时用 ...
- Node.js系列——(1)安装配置与基本使用
1.安装 进入下载地址 小编下载的是msi文件,下一步下一步傻瓜式安装. 打印个hello看看: 2.REPL 全称Read Eval Print Loop,即交互式解释器,可以执行读取.执行.打印. ...
- 第206天:http协议终极详解---看这一篇就够了
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- 洛谷P3601签到题(欧拉函数)
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
- CodeForces 860D Wizard's Tour
题意 给出一张无向图,要求找出尽量多的长度为2的不同路径(边不可以重复使用,点可以重复使用) 分析 yzy:这是原题 http://www.lydsy.com/JudgeOnline/problem. ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- android面试(5)---SQL数据库
SQL基础: 1.如何查询table1从20到30条记录: select * from table1 limit 19,11 2.替换id=1,name =deman的记录? replace into ...