bzoj1597 [Usaco2008 Mar]土地购买
2015-09-04 09:59
288 查看
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
Sample Output
500
HINT
FJ分3组买这些土地: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15 plot. 每组的价格分别为100,100,300, 总共500.Key To Problem
题并不难,但是对于还不会斜率优化的蒟蒻来说简直哭死。 对于一块土地x,如果存在y,使得h[y]>h[x]&&w[y]>w[x],那么x完全被土地y覆盖,就不需要再考虑x土地,所以可以将这些土地去掉。 剩下的土地就可以维护h从小到大,且保证w从大到小。 易证,f[i]=min(f[j]+h[i]*w[j+1]); 为了计算方便,将w数组错一位,f[i]=min(f[j]+h[i]*w[j]); 考虑两个转移f[j],f[k],且k<j<i ; 若对于f[i]从f[j]转移比从f[k]转移更优,那么f[j]+h[i]*w[j]<f[k]+h[i]*w[k];
移项得f(j)−f(k)w(k)−w(j)<h(i)
之后就是斜率优化的部分了:斜率优化,个人觉得这篇博客写的很棒,推荐一下。
Code
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 50010 using namespace std; typedef long long ll; struct node { ll h,w; }; node a ,b ; ll h ,w ; int q ; ll f ; int n,m; int cmp(const void *x,const void *y) { ll h1=(*(node *)x).h,w1=(*(node *)x).w; ll h2=(*(node *)y).h,w2=(*(node *)y).w; if(h1==h2) { if(w2<w1) return -1; return 1; }else if(h1<h2) return -1; return 1; } double ss(int x,int y) { return (double)(f[x]-f[y])/(w[y]-w[x]); } int main() { cin>>n; for(int i=1;i<=n;i++) scanf("%I64d%I64d",&a[i].h,&a[i].w); qsort(a+1,n,sizeof(a[0]),cmp); for(int i=1;i<=n;i++) { while(m&&b[m].w<=a[i].w) m--; b[++m]=a[i]; } for(int i=1;i<=m;i++) h[i]=b[i].h,w[i-1]=b[i].w; int head=0,tail=0; for(int i=1;i<=m;i++) { while(head<tail&&ss(q[head+1],q[head])<h[i]) head++; f[i]=f[q[head]]+h[i]*w[q[head]]; while(head<tail&&ss(i,q[tail])<ss(q[tail],q[tail-1])) tail--; q[++tail]=i; } cout<<f[m]<<endl; return 0; }
相关文章推荐
- BZOJ3275 Number (最小割)
- [bzoj1003] [ZJOI2006]物流运输trans
- [bzoj1500][NOI2005]维修数列
- [bzoj1208] [HNOI2004]宠物收养所
- [bzoj1269][AHOI2006]文本编辑器editort
- [bzoj1503][NOI2004]郁闷的出纳员
- [BZOJ2038][2009国家集训队][莫队][分块]小z的袜子
- [BZOJ2594][WC2006][LCT][MST]水管局长数据加强版
- [BZOJ2300][HAOI2011][动态凸包]防线修建
- [BZOJ1045][HAOI2008][贪心]糖果传递
- [BZOJ2539][CTSC2000][KM]丘比特的烦恼
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- [BZOJ1202][HNOI2005][并查集]狡猾的商人
- [BZOJ1179][APIO2009][Tarjan][拓扑排序][递推]Atm
- [BZOJ1095][ZJOI2007][线段树]Hide捉迷藏
- [BZOJ1089][SCOI2003][递推][高精度]严格n元树
- [BZOJ1096][ZJOI2007][DP][斜率优化]仓库建设
- [BZOJ1071][SCOI2007][堆]组队
- [BZOJ1499][NOI2005][DP+优化]瑰丽华尔兹
- [BZOJ1266][AHOI2006][最短路][最小割]上学路线