【bzoj 1597】[Usaco2008 Mar]土地购买

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.

安利一篇博客……

刚接触斜率优化dp时就是看着这篇博客看懂的>_<

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int N=50050;
 6 int n,cnt,q[N];
 7 long long x[N],y[N],f[N];
 8 struct node{long long x,y;}a[N];
 9 bool cmp(node a,node b){return a.x==b.x?a.y<b.y:a.x<b.x;}
10 long long read()
11 {
12     long long x=0,f=1;char c=getchar();
13     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
14     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
15     return x*f;
16 }
17 double slope(int k,int j){return (double)(f[j]-f[k])/(y[k+1]-y[j+1]);}
18 int main()
19 {
20     n=read();
21     for(int i=1;i<=n;i++)
22         a[i].x=read(),a[i].y=read();
23     sort(a+1,a+n+1,cmp);
24     for(int i=1;i<=n;i++)
25     {
26         while(cnt&&a[i].y>=y[cnt])cnt--;
27         x[++cnt]=a[i].x;y[cnt]=a[i].y;
28     }
29     int l=0,r=0;
30     for(int i=1;i<=n;i++)
31     {
32         while(l<r&&slope(q[l],q[l+1])<x[i])l++;
33         int t=q[l];
34         f[i]=f[t]+y[t+1]*x[i];
35         while(l<r&&slope(q[r-1],q[r])>slope(q[r],i))r--;
36         q[++r]=i;
37     }
38     printf("%lld",f[cnt]);
39     return 0;
40 }

时间: 2024-08-13 07:54:47

【bzoj 1597】[Usaco2008 Mar]土地购买的相关文章

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]土地购买【斜率优化+凸包维护】

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 然后就斜率优化, 单调队列维护一个下凸函数 --------------------------------------

斜率优化专题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) 块长方形的土地. 每块土地的长宽

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]土地购买

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). 每块土地

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). 每

【BZOJ】1597 [Usaco2008 Mar]土地购买

[算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土地x和y,若满足a[x]<=a[y]&&b[x]<=b[y],则x土地可无条件包含在y土地中,所以x土地可以忽略. 于是对长度从小到大排序,第二关键字对宽度从小到大排序,处理掉可被包

[BZOJ1579][Usaco2008 Mar]土地购买

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