bzoj1597: 土地购买
bzoj1597土地购买
【题目】
-点击传送-
【分析】
刚开始没什么思路,但后开就突然开窍了,就是把每块土地的长和宽看做平面直角坐标系里点的横纵坐标
如下:
那么如果你要单独购买一块土地,就是作一个长和宽分别等于这个点的横纵坐标的矩形,其面积就是你要付的费用,我们可以规定矩形的左下角为(0,0),右上角就是这个点。
如果要购买一组土地,题目里说是长和宽分别取最大值然后乘起来,对应到坐标系里就是选最右边的点的横坐标乘以最上边的点的纵坐标。如下:
那么问题就变成了使用面积和最小的若干个矩形(左下角都是(0,0))将所有的点都覆盖。如下是一种随便绘制的方案:
不难发现,如果一个点的横纵坐标都小于另一个点,那么这个点的存在就是没有意义的。因为不管用何种方案把横纵坐标都较大的点覆盖时,这个横纵坐标都较小的点一定被覆盖了。而你的目的是覆盖所有的点,所以这些横纵坐标都较小的点存不存在是不会影响答案的。如下:
我们把这样的点(a,b)叫做红点:存在另一个点(x,y),满足a<=x且b<=y;
把这样的点(a,b)叫做蓝点:对于其它所有的点(x,y),满足a>x或b>y
当我们按照定义把点分类并且把红色的点去掉时,发现剩下的点在一个严格单调下降函数的图像上,如下:
为了方便研究,使用另一张图,如下:
根据蓝点的定义,可以证明这些蓝点在一个严格单调下降函数图像上。
然而这会有没思路了。。。。
回到开始,我们要用面积最小的矩形把这些点覆盖,先随便找几个点,比如我要买图中的第3个点和第6个点所对应的土地,那么我们把它们用矩形框起来。然后我们发现两个东西:
第一:如果要把第i和第j个点框起来,那么中间所有的点都一定被框在里面了(因为单调下降)
第二:框起第i个到第j个点的代价是第i个点的纵坐标乘上第j个点的横坐标(因为单调下降)
如下:
![](/assets/blank.gif)
如果有两个矩形重叠了,比如两个矩形覆盖的点的编号分别是a~b,c~d,其中a<c<b<d那么由单调性可以证明选择a~c,b~d这种方案一定更优,如果一个矩形完全在另一个矩形内部,那你可以直接舍弃这个较小的矩形。
综上,在最优解中,所有矩形所覆盖的点构成一些不相交的区间。如下是一种随便绘制的方案:
用f[i]表示覆盖掉前i个点的最小费用,那么进行划分dp,方程为:
f[i]=min(f[j]+w(j+1,i)),(j<i)
其中w(j+1,i)表示覆盖第j+1个点到第i个点的费用
时间复杂度O(N^2)
【优化】
用w(i,j)表示覆盖第i~j个点的费用,那么w(i,j)=y[i]*x[j]。
由单调性有y[i+1]<y[i],x[i+1]>x[i],恒成立
w(i,j)=y[i]*x[j]
w(i+1,j+1)=y[i+1]*x[j+1]
w(i+1,j)=y[i+1]*x[j]
w(i,j+1)=y[i]*x[j+1]
作差:
[ w(i,j)+w(i+1,j+1) ] - [ w(i+1,j)+w(i,j+1) ]
= y[i]*(x[j]-x[j+1]) + y[i+1]*(x[j+1]-x[j])
= (y[i]-y[i+1])(x[j+1]-x[j]) <0恒成立
所以w(i,j)+w(i+1,j+1) < w(i+1,j)+w(i,j+1)恒成立
所以此dp具有决策单调性
所以就可以进行二分+栈乱搞了
复杂度O(NlogN)
【代码】
#include <cstdio>
#include <algorithm>
#define maxn 60000
#define inf 1000000000001
#define ll long long
using namespace std;
ll f[maxn], N, q[maxn], tot, top;
struct point
{ll x, y;bool operator<(point t)const{return y==t.y? x<t.x : y>t.y;}
}p[maxn];
struct interval
{ll l, r, k;}s[maxn];
void init()
{ll i, j;scanf("%lld",&N);for(i=1;i<=N;i++)scanf("%lld%lld",&p[i].x,&p[i].y);sort(p+1,p+N+1);for(i=1;i<=N;i=j+1){for(j=i;p[j].y==p[j+1].y;j++);if(!tot or p[q[tot]].x<p[j].x)q[++tot]=j;}
}
ll w(ll x, ll y)
{return p[q[x+1]].y*p[q[y]].x;}
ll update(ll x, ll y)
{return x<y?f[x]+w(x,y):(ll)1<<60;}
ll find(interval it, ll x)
{ll l=it.l, r=it.r, mid=l+r>>1;while(l<r){if(update(x,mid)<update(it.k,mid))r=mid;else l=mid+1;mid=l+r>>1;}return l;
}
void work()
{ll i, j, x, l, r, k;s[++top]=(interval){1,tot,0};for(i=1,j=1;i<=tot;i++){if(s[j].r<i)j++;f[i]=update(s[j].k,i);while(1){l=s[top].l, r=s[top].r, k=s[top].k;if(update(i,r)<update(k,r)){if(update(i,l)<update(k,l)){top--;continue;}else {s[top].r=find(s[top],i)-1;break;}}else break;}if(s[top].r<tot)s[top+1]=(interval){s[top].r+1,tot,i},top++;}
}
int main()
{init();work();printf("%lld\n",f[tot]);return 0;
}
bzoj1597: 土地购买相关推荐
- bzoj1597[Usaco2008 Mar]土地购买
bzoj1597[Usaco2008 Mar]土地购买 题意: n块土地,现在要求把土地分成几份,每份费用为该份中土地长最大值和宽最大值成绩,要求最小费用.n≤5000 题解: 当一块土地长宽都比另一 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- 【bzoj1597- [Usaco2008 Mar]土地购买】斜率优化
[597][Usaco2008 Mar]土地购买 [题目描述] 有N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000 ...
- 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3601 Solved: 1322 Descri ...
- 决策单调性Ⅱ:斜率优化(1597: [Usaco2008 Mar]土地购买)
决策单调性Ⅰ:四边形不等式: http://blog.csdn.net/jaihk662/article/details/78174717 决策单调性: 对于dp[i] = min(dp[i], dp ...
- 【bzoj1597】 土地购买
http://www.lydsy.com/JudgeOnline/problem.php?id=1597 (题目链接) 题意 购买n个矩形,每块土地的价格是它的面积,但可以同时购买多快土地. 这些土地 ...
- BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
- bzoj1597 [Usaco2008 Mar]土地购买
题目描述 题解: 我们可以考虑这样一种情况,有一块$10*10$的土地,还有一块$1*1$的土地. 当然将$1*1$的土地合到$10*10$的土地中了. 所以我们可以先按土地$x$值从大到小排序,然后 ...
- 【BZOJ1597】【Tyvj2461】土地购买,第一次的斜率优化DP
传送门1 传送门2 写在前面:看了好久斜率优化DP,感觉还是不太懂 思路: (受大牛博文启发) 1.除去无效边,li>=lj且ri>=rj,则j可以直接扔掉不要.因此我们可以按l或r排一下 ...
- bzoj 1597 土地购买
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 < = 1,000 ...
最新文章
- JavaScript获取样式值的几种方法学习总结
- volatile对原子性、可见性、有序性的保证
- sparkmllib scala GBDT Demo
- ad中那个快捷键是重复上一部_十大快捷键:让PPT制作效率飞起!(附下载)
- centos 系统管理维护指南
- SQL Server语句
- ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
- (王道408考研数据结构)第六章图-第四节2:最小生成树之克鲁斯卡尔算法(思想、代码、演示、答题规范)
- Dockerfile构建LNMP分离环境部署wordpress
- 并查集 路径压缩(具体解释)
- 052011GR2 _optimizer_null_aware_antijoin
- 《物联网框架ServerSuperIO教程》-19.设备驱动和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化。v3.6.4版本发布...
- Oracle查询优化改写技巧与案例总结二
- dex转java工具_安卓dex反编译工具(dex-translator)
- r语言平均值显著性检验_R语言标记显著性标记
- 华为 eNSP启动设备AR1失败 错误代码40
- php对数据进行归一化处理方法,12种数据量纲化处理方式
- Delphi制作带图标的弹出式选单
- Apache Velocity 模板语言 特殊字符${ $!{ 原样输出问题 转义符 # ! 无效
- 盛水容器问题php代码,盛水容器的形状如图2-13所示,已知各水面高程为▽1=1.15m,▽2=0.68m,▽3=0.44m...