题目链接

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

我们按照宽$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[Usaco2008 Mar]土地购买 斜率优化dp

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

  2. bzoj1597 [Usaco2008 Mar]土地购买——斜率优化DP

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

  3. BZOJ1597: [Usaco2008 Mar]土地购买——斜率优化

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

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

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

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

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

  6. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

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

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

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

  8. [bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)

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

  9. [BZOJ1597][Usaco2008 Mar]土地购买(斜率优化)

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

随机推荐

  1. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary

    题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...

  2. winform 异步更新ui

    http://download.csdn.net/download/mingge38/9378852

  3. 2019.9.23JAVA课堂测试

    1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...

  4. 值不能为空。参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explorer)

    打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空.参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explo ...

  5. android遮罩阴影对话框的实现

    定义 <style name="MyDialog" parent="@android:Theme.Dialog"> <item name=&q ...

  6. VASP学习笔记--简单的VASP运行实例:CrI3做非磁的优化

    一.总体思路 1)写入INCAR: 2)写入POSCAR,就是坐标文件: 3)写入KPOINTS文件,就是K点的选择: 4)写入POTCAR,写入POTCAR(找到势文件,然后按照POSCAR中的元素 ...

  7. 阶段3 1.Mybatis_12.Mybatis注解开发_3 mybatis注解开发保存和更新功能

    使用直接来实现CRUD操作 Insert方法 创建测试类 把变量都定义在外面 写测试方法 修改链接的数据库 update方法 再加上address 被更新的数据

  8. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_7 Mybatis中使用代理Dao的执行过程分析

    另外一种情况,不写Mybits的dao实现类的情况. 切换工程到CRUD的工程.这里面是不写dao实现类的方式 进入到GetMaper里面.这里是创建代理对象 去找SqlSession的实现类Defa ...

  9. wpf 非窗体类中 异步调用窗体与控件

    App.Current.Dispatcher.Invoke((Action)(() => { MessageBoxWindow mwb = ); mwb.ShowDialog(); return ...

  10. JavaWeb项目:Shiro实现简单的权限控制(整合SSM)

    该demo整合Shiro的相关配置参考开涛的博客 数据库表格相关设计  表格设计得比较简单,导航栏直接由角色表auth_role的角色描述vRoleDesc(父结点)和角色相关权限中的权限描述(标记为 ...