[Bzoj1597][Usaco2008 Mar]土地购买(斜率优化)
因为题目说可以分组,并且是求最值,所以斜率优化应该是可以搞的,现在要想怎么排序使得相邻的数在一个组中最优。
我们按照宽$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, ...
随机推荐
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary
题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...
- winform 异步更新ui
http://download.csdn.net/download/mingge38/9378852
- 2019.9.23JAVA课堂测试
1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...
- 值不能为空。参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explorer)
打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空.参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explo ...
- android遮罩阴影对话框的实现
定义 <style name="MyDialog" parent="@android:Theme.Dialog"> <item name=&q ...
- VASP学习笔记--简单的VASP运行实例:CrI3做非磁的优化
一.总体思路 1)写入INCAR: 2)写入POSCAR,就是坐标文件: 3)写入KPOINTS文件,就是K点的选择: 4)写入POTCAR,写入POTCAR(找到势文件,然后按照POSCAR中的元素 ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_3 mybatis注解开发保存和更新功能
使用直接来实现CRUD操作 Insert方法 创建测试类 把变量都定义在外面 写测试方法 修改链接的数据库 update方法 再加上address 被更新的数据
- 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_7 Mybatis中使用代理Dao的执行过程分析
另外一种情况,不写Mybits的dao实现类的情况. 切换工程到CRUD的工程.这里面是不写dao实现类的方式 进入到GetMaper里面.这里是创建代理对象 去找SqlSession的实现类Defa ...
- wpf 非窗体类中 异步调用窗体与控件
App.Current.Dispatcher.Invoke((Action)(() => { MessageBoxWindow mwb = ); mwb.ShowDialog(); return ...
- JavaWeb项目:Shiro实现简单的权限控制(整合SSM)
该demo整合Shiro的相关配置参考开涛的博客 数据库表格相关设计 表格设计得比较简单,导航栏直接由角色表auth_role的角色描述vRoleDesc(父结点)和角色相关权限中的权限描述(标记为 ...