[Bzoj1597][Usaco2008 Mar]土地购买(斜率优化)

时间:2022-02-23 14:41:17

题目链接

因为题目说可以分组,并且是求最值,所以斜率优化应该是可以搞的,现在要想怎么排序使得相邻的数在一个组中最优。

我们按照宽$w$从小到大,高$h$从小到大排序。这时发现可以筛掉一些一定没有贡献的土地,什么样的土地没有贡献呢?这样的:$h[i]<=h[j]\& \&w[i]<=w[j]$,此时i没有贡献。

所以排序并筛掉无用的土地后,剩余的土地是按照$w[i]<  w[j]< w[k]\& \&h[i]> h[j]>h[k]$ $(i<j<k)$

这时候我们的最优分组一定是选择连续的土地为一组。因为如果i和k一组,j一组,则此时的花费是$h[i]*w[k]+h[j]*w[j]$

而选择$i,j,k$一组,则花费为$h[i]*w[k]$

所以此时有$O(n^{2})$的$dp$:

$dp[i]$为前$i$块土地的最少花费,$dp[i]=max(dp[i],dp[j]+h[j+1]*w[i])$。

但是复杂度不允许QAQ

所以推式子:

设$k<j<i$,且i从j转移比从k转移更优。

$dp[j]+h[j+1]*w[i]\leq dp[k]+h[k+1]*w[i]$

$dp[j]-dp[k]\leq (h[k+1]-h[j+1])*w[i]$

$\tfrac{dp[j]-dp[k]}{h[k+1]-h[j+1]}\leq w[i]$

$\tfrac{dp[j]-dp[k]}{h[j+1]-h[k+1]}\geq- w[i]$

将$(h[j+1],dp[j]),(h[k+1],dp[k])$看成二维平面的点,因为$k<j\& \&h[k+1]>h[j+1]$,所以点集应该是从左往右。

维护一个单调队列,如果当前点为$i$,队首为$L$,则如果$L$没有$L+1$到$i$更优,则队首出队。当前最优点为队首。同时还要维护队尾。

PS:因为以前吃过精度的坑,所以写斜率优化基本是移相相乘。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e4 + ;
struct node {
ll w, h;
}a[maxn], b[maxn];
bool cmp(node x, node y) {
return x.w == y.w ? x.h < y.h : x.w < y.w;
}
ll dp[maxn]; int q[maxn];
ll check1(int j, int k) {
return dp[j] - dp[k];
}
ll check2(int j, int k) {
return b[j + ].h - b[k + ].h;
}
int main() {
int n, cnt = ;
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%lld%lld", &a[i].w, &a[i].h);
sort(a + , a + + n, cmp);
for (int i = ; i <= n; i++) {
while (cnt != && b[cnt].h <= a[i].h)
cnt--;
b[++cnt] = a[i];
}
int l = , r = ;
for (int i = ; i <= cnt; i++) {
while (l < r && check1(q[l], q[l + ]) >= -b[i].w * check2(q[l], q[l + ]))
l++;
dp[i] = dp[q[l]] + b[q[l] + ].h * b[i].w;
while (l < r && check1(q[r - ], q[r]) * check2(q[r], i) <= check1(q[r], i) * check2(q[r - ], q[r]))
r--;
q[++r] = i;
}
printf("%lld\n", dp[cnt]);
}

[Bzoj1597][Usaco2008 Mar]土地购买(斜率优化)的更多相关文章

  1. bzoj1597&lbrack;Usaco2008 Mar&rsqb;土地购买 斜率优化dp

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

  2. bzoj1597 &lbrack;Usaco2008 Mar&rsqb;土地购买——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 就是斜率优化水题... 然而WA了十几遍,正负号处理真让人心累... 还是该负就负,别 ...

  3. BZOJ1597&colon; &lbrack;Usaco2008 Mar&rsqb;土地购买——斜率优化

    题目大意: 将$n$个长方形分成若*分,每一部分的花费为部分中长方形的$max_长*max_宽$(不是$max_{长*宽}$),求最小花费 思路: 首先,可以被其他长方形包含的长方形可以删去 然后我 ...

  4. BZOJ 1597&colon; &lbrack;Usaco2008 Mar&rsqb;土地购买 &lbrack;斜率优化DP&rsqb;

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

  5. BZOJ 1597&colon; &lbrack;Usaco2008 Mar&rsqb;土地购买 斜率优化

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

  6. bzoj 1597 &lbrack;Usaco2008 Mar&rsqb;土地购买——斜率优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...

  7. 【斜率DP】bzoj1597&colon; &lbrack;Usaco2008 Mar&rsqb;土地购买

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

  8. &lbrack;bzoj1597&rsqb;&lbrack;usaco2008 mar&rsqb;土地购买 &lpar;动态规划&plus;斜率优化&rpar;

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  9. &lbrack;BZOJ1597&rsqb;&lbrack;Usaco2008 Mar&rsqb;土地购买(斜率优化)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

随机推荐

  1. js连接字符串

    实例 对象令人感兴趣的一点是用它们解决问题的方式.ECMAScript 中最常见的一个问题是字符串连接的性能.与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变.请考虑下面的 ...

  2. 关于gcd函数解最大公约数

    数学知识:由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积.即(a,b)×[a,b]=a×b.所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数.例如 ...

  3. 《Spring3&period;0就这么简单》

    第一章 认识Spring 1.Spring提供的IOC容器,是Spring大杀器之一.容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创 ...

  4. SBT模版

    /*Author:WNJXYK*/ #include<cstdio> using namespace std; ; struct SBT{ int left; int right; int ...

  5. Tomcat8安装及配置教程

    Apache  Tomcat8.0安装及配置教程.. Apache  Tomcat8.0官方网站链接:http://tomcat.apache.org/ apache-tomcat-8.0.39-wi ...

  6. 201521123102 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2.书面作业 1.常用异常 题目5-1 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...

  7. &lbrack;BZOJ&rsqb;1047 理想的正方形&lpar;HAOI2007&rpar;

    真·水题.小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来. Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和 ...

  8. 问题解决--无法解析的外部符号 &lowbar;imp&lowbar;XXXXXXXXX

    错误示例: 出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp.比如说_imp_GetUserNameA就是GetUserNameA函数. 会报 ...

  9. java 获取下一个字母(传大写返回大写,传小写返回小写)

    public static String getNextUpEn(String en){ char lastE = 'a'; char st = en.toCharArray()[0]; if(Cha ...

  10. JS&sol;javaScript 获取div内容

    jquery: 例如<div id="abc"><a>内容</a></div>$("#abc").html(); ...