传送门:>HERE<

题意:购买一组土地的费用是最长的长乘以最长的宽。现给出n块土地,求购买所有土地(可以将土地分为任意组,不需按顺序)的最小费用

解题思路

动态规划+斜率优化

斜率优化在这道题里并不难,关键是第一步的方程以及思想

由于买一组土地的关键是最大的长和宽,所以设任意两块土地$x, y$,若$w[x] \leq w[y] 且 l[x] \leq l[y]$,那么我们可以把$x, y$放在一组里,这样x存不存在都一样。因此x就可以扔掉不管了。所以第一步我们可以把所有没用的都扔掉。

那么怎么扔呢?首先对所有土地以高度为第一关键字,宽度为第二关键字从小到大排序。直接利用单调栈踢出所有没用的土地——然后让每一块土地依次进栈,由于高度是单调递增的,那么如果当前土地的宽度 $\geq$ 栈顶的宽度,也就意味着栈顶那块就没用了,因此可以pop

这样做有什么好处?令$f[i]$表示购买前i块土地的费用,枚举断点j,得状态转移方程$$f[i] = f[j] + h[i] * w[j+1]$$由于现在栈内已经单调,根据递增与递减的性质,就可以O(1)求得这一区间土地长宽的最大最小值了

然后就可以做斜率优化的DP了。

Code

long long

坑点挺多的,调了一上午。先是x坐标移项之后是负的,并且栈溢出要判断,不然top减成负数了。

/*By QiXingzhi*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
#define int long long
const int MAXN = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
struct Land{ int w,h; }a[MAXN],A[MAXN];
int n,top,h,t,sta[MAXN],q[MAXN],f[MAXN];
inline bool comp(const Land& a, const Land& b){ return (a.h != b.h) ? a.h < b.h : a.w < b.w; }
inline double X(int i){ return -A[i+].w; }
inline double Y(int i){ return f[i]; }
inline double Slope(int i, int j){ return (double)(Y(i)-Y(j)) / (double)(X(i)-X(j)); }
main(){
n = r;
for(int i = ; i <= n; ++i) a[i].w = r, a[i].h = r;
sort(a+, a+n+, comp);
sta[++top] = ;
for(int i = ; i <= n; ++i){
while(top> && a[i].w >= a[sta[top]].w) --top;
sta[++top] = i;
}
for(int i = ; i <= top; ++i) A[i] = a[sta[i]];
for(int i = ; i <= top; ++i){
while(h<t && Slope(q[h],q[h+]) < A[i].h) ++h;
f[i] = f[q[h]] + A[q[h]+].w * A[i].h;
while(h<t && Slope(q[t],q[t-]) > Slope(q[t],i)) --t;
q[++t] = i;
}
printf("%lld", f[top]);
return ;
}

[USACO2008 Mar]土地购买的更多相关文章

  1. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  2. 1597: [Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit] ...

  3. 【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2474  Solved: 900[Submit][ ...

  4. 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3601  Solved: 1322 Descrip ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  6. BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit] ...

  7. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5524  Solved: 2074[Submit] ...

  8. 【bzoj1597】[Usaco2008 Mar]土地购买

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3739  Solved: 1376[Submit] ...

  9. BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...

  10. 1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ] 未完

    传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1979  Solved: 705[Subm ...

随机推荐

  1. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则

    朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则 [下载本文PDF进行阅读] 本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. ...

  2. flask请求流程详解

    先看一个流程图: 1.当一个请求进入的时候,Flask框架首先会实例化一个Request Context,封装了请求信息,保存在Request中.生成请求上下文后,Flask框架会将请求上下文推入到_ ...

  3. HDU 3478 Catch (连通性&&二分图判断)

    链接 [https://vjudge.net/contest/281085#problem/C] 题意 一个n个点,m条边的图,开始的点是s 每次必须移动到相邻的位置,问你是否存在某个时刻所有点都可能 ...

  4. Python学习第五篇——如何访问字典

    # the example_1 aim to tell how to use dctionary,and how to access list or dictionary infos={"f ...

  5. XGBoost模型的参数调优

    XGBoost算法在实际运行的过程中,可以通过以下要点进行参数调优: (1)添加正则项: 在模型参数中添加正则项,或加大正则项的惩罚力度,即通过调整加权参数,从而避免模型出现过拟合的情况. (2)控制 ...

  6. win64位安装python-mysqldb1.2.3

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:“Cannot open include file: 'config-win.h': No ...

  7. [转帖]一段关于Unix与 Linux的暗黑史

    一段关于Unix与 Linux的暗黑史 https://blog.csdn.net/a343315623/article/details/51436715 微软曾经开发过 MS-DOS Xenix O ...

  8. opencv自带fast_math.hpp

    cvRound cvFloor cvCeil cvIsNaN cvIsInf

  9. Laravel渴求式加载(比较容易理解理解load与with关系)

    渴求式加载 当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载.不过,Eloquent 还可以在查询父级模型的同时「渴求 ...

  10. API知识点总结

    一.开发api接口开放给其他人调用的api接口(短信接口,支付宝api) 二.api安全弱点数据窃取(解决加密),数据篡改(解决MD5),数据泄露(爬虫技术)(解决令牌)1.加密(HTTPS传输-收费 ...