因为题目说可以分组,并且是求最值,所以斜率优化应该是可以搞的,现在要想怎么排序使得相邻的数在一个组中最优。
我们按照宽$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]土地购买(斜率优化)的更多相关文章
-
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了十几遍,正负号处理真让人心累... 还是该负就负,别 ...
-
BZOJ1597: [Usaco2008 Mar]土地购买——斜率优化
题目大意: 将$n$个长方形分成若*分,每一部分的花费为部分中长方形的$max_长*max_宽$(不是$max_{长*宽}$),求最小花费 思路: 首先,可以被其他长方形包含的长方形可以删去 然后我 ...
-
BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
-
BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MB Description 农夫John准备扩大他的农场,他正在考虑N ...
-
bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
-
【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2474 Solved: 900[Submit][ ...
-
[bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
-
[BZOJ1597][Usaco2008 Mar]土地购买(斜率优化)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
随机推荐
-
js连接字符串
实例 对象令人感兴趣的一点是用它们解决问题的方式.ECMAScript 中最常见的一个问题是字符串连接的性能.与其他语言类似,ECMAScript 的字符串是不可变的,即它们的值不能改变.请考虑下面的 ...
-
关于gcd函数解最大公约数
数学知识:由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积.即(a,b)×[a,b]=a×b.所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数.例如 ...
-
《Spring3.0就这么简单》
第一章 认识Spring 1.Spring提供的IOC容器,是Spring大杀器之一.容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创 ...
-
SBT模版
/*Author:WNJXYK*/ #include<cstdio> using namespace std; ; struct SBT{ int left; int right; int ...
-
Tomcat8安装及配置教程
Apache Tomcat8.0安装及配置教程.. Apache Tomcat8.0官方网站链接:http://tomcat.apache.org/ apache-tomcat-8.0.39-wi ...
-
201521123102 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2.书面作业 1.常用异常 题目5-1 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...
-
[BZOJ]1047 理想的正方形(HAOI2007)
真·水题.小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来. Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和 ...
-
问题解决--无法解析的外部符号 _imp_XXXXXXXXX
错误示例: 出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp.比如说_imp_GetUserNameA就是GetUserNameA函数. 会报 ...
-
java 获取下一个字母(传大写返回大写,传小写返回小写)
public static String getNextUpEn(String en){ char lastE = 'a'; char st = en.toCharArray()[0]; if(Cha ...
-
JS/javaScript 获取div内容
jquery: 例如<div id="abc"><a>内容</a></div>$("#abc").html(); ...