BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化】
来源:互联网 发布:控制鼠标的软件 编辑:程序博客网 时间:2024/05/21 16:11
Description
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这些土地可以节省经费. 他需要你帮助他找到最小的经费.
题解
首先,我们可以发现,如果一个矩阵的长和宽都小于等于令一个矩阵的长和宽,那么这个矩阵就被废掉了。这样处理掉有什么好处呢?显然,如果按照长度从小到大排序,那么宽度一定是递减的,这样,我们每次购买的就一定是一个区间,就可以方便的写出DP的转移方程。f[i]=min(f[i],f[j]+a[j+1].y*a[i].x),然后裸写DP肯定是不可以的,所以就用斜率优化搞一下。
代码
#include<cstdio>#include<cstring>#include<algorithm>#define maxn 50006#define LL long longusing namespace std;inline char nc(){ static char buf[100000],*i=buf,*j=buf; return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++;}inline int _read(){ char ch=nc();int sum=0; while(!(ch>='0'&&ch<='9'))ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum;}struct point{ LL x,y; LL operator *(const point&b)const{return x*b.y-y*b.x;} point operator -(const point&b)const{point c;c.x=x-b.x;c.y=y-b.y;return c;}}que[maxn];struct data{ int x,y; bool operator <(const data&b)const{return x<b.x||(x==b.x&&y<b.y);}}a[maxn],b[maxn];int n,m,a0;LL f[maxn];bool vis[maxn];LL cross(point x,point y,point z){ return (z-y)*(y-x);}int main(){ freopen("acquire.in","r",stdin); freopen("acquire.out","w",stdout); n=_read(); for(int i=1;i<=n;i++)a[i].x=_read(),a[i].y=_read(); int Max=0; sort(a+1,a+1+n); for(int i=n;i>=1;i--) if(a[i].y>Max)vis[i]=1,Max=a[i].y; for(int i=1;i<=n;i++) if(vis[i])b[++m]=a[i]; int i=1; while(i<=m){ int j=i; while(j<=m&&b[j].y<=b[j+1].y)j++; a[++a0].x=b[j].x;a[a0].y=b[j].y;i=j+1; } int hed=1,tal=1;que[1].y=0;que[1].x=-a[1].y; for(int i=1;i<=a0;i++){ point x;x.x=1;x.y=a[i].x; while(hed<tal&&((que[hed+1]-que[hed])*x>=0))hed++; f[i]=que[hed].y-a[i].x*que[hed].x;x.x=-a[i+1].y;x.y=f[i]; while(hed<tal&&(cross(que[tal-1],que[tal],x)>=0))tal--; que[++tal]=x; } printf("%lld",f[a0]); return 0;}
阅读全文
0 0
- [BZOJ 1597] Usaco2008 Mar 土地购买 · 斜率优化DP
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化)
- BZOJ 1597:[Usaco2008 Mar]土地购买(斜率优化)
- [BZOJ 1597][Usaco2008 Mar]土地购买:DP斜率优化
- BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化】
- BZOJ 1597 [Usaco2008 Mar]土地购买 动态规划+斜率优化
- [斜率DP优化]BZOJ 1597: [Usaco2008 Mar]土地购买 题解
- 1597: [Usaco2008 Mar]土地购买 斜率优化
- 【BZOJ 3636】[Usaco2008 Mar]土地购买 斜率优化dp
- 【斜率DP】【bzoj 1597】: [Usaco2008 Mar]土地购买
- 斜率优化 [Usaco2008 Mar]土地购买
- 1597: [Usaco2008 Mar]土地购买 斜率优化dp
- 1597: [Usaco2008 Mar]土地购买 斜率优化dp
- 斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
- BZOJ 1597 Usaco 2008 Mar 土地购买 斜率优化DP
- [BZOJ 1597][USACO 2008 Mar]土地购买(DP+斜率优化)
- bzoj 1597: [Usaco2008 Mar]土地购买
- 两种Linux系统安装方式:预装和非预装
- 2054数据结构实验之链表九:双向链表
- Java返回语句-return
- JAVA 第七章集合(五)
- 编程练习2——04
- BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化】
- 吐了#8
- Sqrt(x)
- Linux21个常用高效命令
- C语言数据结构之普通树篇
- 强化练习6:判断一字符串是否为回文,是返回1,不是返回0,出错返回-1
- Java正则表达式
- ActiveReports报表设计器
- 654. Maximum Binary Tree