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.

题解

斜率优化好像是很久之前的坑?

推式子真是太刺激了.

对于这道题,购买的土地并不是连续的,所以原始数据并不具有决策单调性.

所以我们需要通过某些操作,构造出一个决策单调性.

有一种方法好像是用堆...?我本人是sort了一遍,按照第一关键字长度递增,第二关键字宽度递增.

然后扫一遍,把小块放在大块中一起购买(相当于合并)

这样最后得到的数据就有决策单调性了,因为这时连着买肯定比跳着买要优越

然后我们再手推一下式子

f[i]=f[j]+land[j+1].y*land[i].x

对于某两个决策点j1,j2,如果j1优于j2

f[j1]+land[j1+1].y*land[i].x<f[j2]+land[j2+1].y*land[i].x

f[j1]-f[j2]<land[i].x*(land[j2+1].y-land[j1+1].y)

(f[j1]-f[j2])/(land[j2+1].y-land[j1+1].y)<land[i].x

设k(j1,j2)=(f[j1]-f[j2])/(land[j2+1].y-land[j1+1].y)

那么我们用一个单调队列q[]来维护,

设头为h,尾为t,则q[h+1]比q[h]优时,有k(q[h+1],q[h])<x[i],此时h++

对于插入元素i,如果i比q[t]优,则k(i,q[t])<k(q[t],q[t-1]),此时t--

然后照着打就行了,代码见下

 #include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=;
int n,e,q[N],head,tail;
LL f[N];
struct node{LL x,y;}land[N],s[N];
inline bool mt(const node &a,const node &b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline double k(int j1,int j2){return (double)(f[j1]-f[j2])/(s[j2+].y-s[j1+].y);}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld%lld",&land[i].x,&land[i].y);
sort(land+,land+n+,mt);
for(int i=;i<=n;i++)
{
while(e&&land[i].y>=s[e].y)e--;
s[++e]=land[i];
}
for(int i=;i<=e;i++)
{
while(head<tail&&k(q[head+],q[head])<s[i].x)head++;
f[i]=f[q[head]]+s[q[head]+].y*s[i].x;
while(head<tail&&k(i,q[tail])<k(q[tail],q[tail-]))tail--;
q[++tail]=i;
}
printf("%lld",f[e]);
}

BZOJ1597

[BZOJ1597]土地购买的更多相关文章

  1. BZOJ1597土地购买 【斜率优化DP】

    BZOJ1597土地购买 [斜率优化DP] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足( ...

  2. BZOJ1597 土地购买 【dp + 斜率优化】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5466  Solved: 2035 [Submi ...

  3. 【BZOJ-1597】土地购买 DP + 斜率优化

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

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

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

  5. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp

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

  6. 【bzoj1597】[Usaco2008 Mar]土地购买

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

  7. bzoj1597: [Usaco2008 Mar]土地购买 dp斜率优化

    东风吹战鼓擂第一题土地购买送温暖 ★★★   输入文件:acquire.in   输出文件:acquire.out   简单对比时间限制:1 s   内存限制:128 MB 农夫John准备扩大他的农 ...

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

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

  9. 1597: [Usaco2008 Mar]土地购买

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

随机推荐

  1. Angularjs快速入门(四)-css类和样式

    例子: .error{background-color:red;} .warning{background-color:yellow;} <div ng-controller='HeaderCo ...

  2. 使用虚拟机CentOS7部署CEPH集群

    第1章   CEPH部署 1.1  简单介绍 Ceph的部署模式下主要包含以下几个类型的节点 Ø CephOSDs: A Ceph OSD 进程主要用来存储数据,处理数据的replication,恢复 ...

  3. 【珍藏】linux 同步IO: sync、fsync与fdatasync

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列, ...

  4. 移动端H5开发 (滑动事件)

    最近一直在做手机App H5的开发,在开发过程中,经常会遇到很多滑动事件,写个demo,分享自己的一些写法.(如写的不好,轻喷!) 直接贴代码 html css代码 <!DOCTYPE html ...

  5. ubuntu实用命令--软件管理

    近期重新拿起linux的书看了下,整理了一下linux的命令. ubuntu预装了APT和dpkg ,“APT”是 “Advanced Package Tool”的简写,“dpkg ”是“Debian ...

  6. js正则表达式详解

    一.正则的两种写法: var re = /a/; //一般情况下都用简写的方式 性能好 var re = new RegExp('a'); //需要传入参数的时候用 二.转义字符: \n 换行 \r ...

  7. poj2653线段相交判断

    Stan has n sticks of various length. He throws them one at a time on the floor in a random way. Afte ...

  8. .NET Core 2.0体验

    .NET Core 2.0预览版及.NET Standard 2.0 Preview 这个月也就要发布了. 具体相关信息可以查看之前的文章.NET Core 2.0及.NET Standard 2.0 ...

  9. 异步工作流控制-condCall

    在JavaScript编程中,异步操作一直是一个问题,回调是一种深层次的嵌套处理方式,我们也可以把嵌套处理转为直线处理以简化异步处理.有过prolog和erlang编程了解的同学可能对模式匹配有深刻的 ...

  10. 在Ubuntu下永久修改主机名

    一. deb/ubuntu上永久修改 : 查看主机名: 修改主机名: 重启后生效 ---------------------------------------------------------- ...