斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147

【原题】

1597: [Usaco2008 Mar]土地购买

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1396  Solved: 480

[Submit][Status]

Description

农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ能够同一时候购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 可是土地的长宽不能交换. 假设FJ买一块3x5的地和一块5x3的地,则他须要付5x5=25.
FJ希望买下全部的土地,可是他发现分组来买这些土地能够节省经费. 他须要你帮助他找到最小的经费.

Input

* 第1行: 一个数: N

* 第2..N+1行: 第i+1行包括两个数,分别为第i块土地的长和宽

Output

* 第一行: 最小的可行费用.

Sample Input

4

100 1

15 15

20 5

1 100

输入解释:

共同拥有4块土地.

Sample Output

500

HINT

FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.

Source

Gold

【分析】太神了!看了JokerPark大牛的博客,受益匪浅。可是有些地方開始还是没看懂,因此自己也推了半天公式。

设第i块地的长和宽是ai,bi。

①先考虑无效的边。设ai>=aj且bi>=bj,那么j一定是无效边。怎么求呢?首先我们把ai按升序排序,然后做一遍类似于单调队列的操作。枚举i,假设bi>=队列尾部的bj,那么尾指针就减1。由于a已经是升序排好了,ai>=aj是肯定的。

②去掉边后,我们还发现了一个有趣的性质。在队列中,由于a一定是升序排好的,那么b一定是降序的。(自己YY)

③于是DP方程呼之欲出:f[i]=max(f[i],f[j]+a[j+1]*b[i])。毫无疑问,这是一个超时的算法。如今就要推斜率优化了!!设在当前的状态f[i]时,从f[j]转移比f[k]优。那么f[j]+a[j+1]*b[i]<f[k]+a[k+1]*b[i]。化简一下:b[i]<(f[k]-f[j])/(a[j+1]-a[k+1])。说明,假设j和k满足上述要求,k能够无视了,由于j一定比k更优。依据这个,我们维护一个单调队列。

【代码】

#include<cstdio>
#include<algorithm>
#define N 50005
using namespace std;
struct arr{long long x,y;}a[N],b[N];
long long f[N],q[N],n,i,h,t,m;
bool cmp(arr a,arr b){return a.x<b.x||a.x==b.x&&a.y>b.y;}
int main()
{
  scanf("%lld",&n);
  for (i=1;i<=n;i++)
    scanf("%lld%lld",&b[i].x,&b[i].y);
  sort(b+1,b+n+1,cmp);
  m=1;a[1].x=b[1].x;a[1].y=b[1].y;
  for (i=2;i<=n;i++)
  {
    while (m&&b[i].y>a[m].y) m--;
    a[++m].x=b[i].x;a[m].y=b[i].y;
  }
  h=1;t=1;q[1]=0;f[0]=0;
  for (i=1;i<=m;i++)
  {
    while ((h<t)&&(a[i].x*(a[q[h]+1].y-a[q[h+1]+1].y)>f[q[h+1]]-f[q[h]])) h++;
    f[i]=f[q[h]]+a[q[h]+1].y*a[i].x;
    while ((h<t)&&(f[i]-f[q[t-1]])*(a[q[t]+1].y-a[i+1].y)>=(f[i]-f[q[t]])*(a[q[t-1]+1].y-a[i+1].y)) t--;
    q[++t]=i;
  }
  printf("%lld",f[m]);
  return 0;
}
时间: 2024-10-06 01:59:50

斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解的相关文章

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

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地

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

既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i转移比由j转移优(i>j), 那么 dp(i)+xv*yi+1 < dp(j)+xv*yj+1 化简得 (dp(i) - dp(j))/(yi+1-yj+1) > -xv 然后就斜率优化, 单调队列维护一个下凸函数 --------------------------------------

bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 697  Solved: 244[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x上.只要改一下slope里的一个负号,就变成正常舒服的递增了. 这道题的要点其实是一开始h=0.不能h=1.这样就能把dp[0]纳入考虑.这是需要的. #include<iostream> #include<cstdio> #include<cstring> #includ

bzoj 1597: [Usaco2008 Mar]土地购买

式子显然随便搞搞就行,,而且可以先把这些矩形排序,然后如果有比当前矩形x和y都大的矩形,这个矩形是可以忽略的. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define lowbit(x) x&(-x) 4 #define inf 0x3f3f3f3f 5 #define eps 1e-5 6 #define N 100005 7 using namespace std; 8 inline int ra() 9 { 10 i

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

传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1979  Solved: 705[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每

斜率优化专题4——bzoj 1911: [Apio2010] 特别行动队 题解

[原题] 1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 2134  Solved: 911 [Submit][Status] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT [分析]只要跟着我前面的题目走,这道题真的是太水了.神马题解都不用参考,公式随便推. 易知方程是f[i]=max(f[j]+

斜率优化专题2——bzoj 1010 [HNOI2008]玩具装箱toy 题解

[原题] 1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5434  Solved: 1969 [Submit][Status] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授

1597: [Usaco2008 Mar]土地购买

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地