【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

1597: [Usaco2008 Mar]土地购买

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3601  Solved: 1322

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.

 

 

【分析】

   

  因为要买所有土地,所以如果一个矩形完全被另一个矩形包含,那么可以不考虑小的那个矩形。

  去掉他们只有按照长x升序排序,可以发现宽y都是降序的(不然会被去掉),所以容易知道我们每次取的一组都是连续的一段。

  设答案为f[i]

  则f[i]=x[i]*y[j+1]+f[j] 得到斜率优化标准式子,维护一个左下凸包。

 

代码如下:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 50010
10 #define LL long long
11 
12 struct hp
13 {
14     LL x,y;
15 }a[Maxn];
16 
17 bool cmp(hp x,hp y) {return (x.x==y.x)?(x.y<y.y):(x.x<y.x);}
18 
19 struct node
20 {
21     LL x,y;
22 }t[Maxn];
23 
24 LL f[Maxn];
25 
26 bool check(int x,int y,int k)
27 {
28     LL kk=k;
29     return kk*(t[x].x-t[y].x)<=t[x].y-t[y].y;
30 }
31 
32 bool check2(int x,int y,int z)
33 {
34     return (t[y].x-t[z].x)*(t[x].y-t[y].y)<=(t[x].x-t[y].x)*(t[y].y-t[z].y);
35 }
36 
37 int main()
38 {
39     int n;
40     scanf("%d",&n);
41     for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
42     sort(a+1,a+1+n,cmp);
43     int cnt=0;
44     for(int i=1;i<=n;i++)
45     {
46         while(cnt>0&&a[i].y>=a[cnt].y) cnt--;
47         a[++cnt]=a[i];
48     }
49     int len=0,st;
50     t[++len].x=a[1].y;t[len].y=0;st=1;
51     for(int i=1;i<=cnt;i++)
52     {
53         while(st<len&&check(st,st+1,-a[i].x)) st++;
54         f[i]=a[i].x*t[st].x+t[st].y;
55         t[0].x=a[i+1].y;t[0].y=f[i];
56         while(st<len&&check2(len-1,len,0)) len--;
57         t[++len]=t[0];
58     }
59     printf("%lld\n",f[cnt]);
60     return 0;
61 }
[BZOJ 1597]

 

2016-09-19 20:15:26

转载于:https://www.cnblogs.com/Konjakmoyu/p/5886483.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出学java_《深入浅出学JAVA开发初级》

整体说明&#xff1a;Java私塾的这一套视频是完全真实课堂录制&#xff0c;实际上课时间为十一天&#xff0c;主要内容包括&#xff1a;1&#xff1a;系统完整的学习Java的基础知识2&#xff1a;深入剖析重点知识点的理论3&#xff1a;超多的编程题目和程序讲解4&#xff1a;最…

重定位与链接脚本

1.为什么需要重定位   位置无关编码(PIC&#xff0c;position independent code)&#xff1a;汇编源文件被编码成二进制可执行程序时编码方式与位置&#xff08;内存地址&#xff09;无关。  位置有关编码&#xff1a;汇编源码编码成二进制可执行程序后和内存地址是有关的。…

Linux bashrc和profile的用途和区别

导读使用终端ssh登录Linux操作系统的控制台后&#xff0c;会出现一个提示符号&#xff08;例如&#xff1a;#或~&#xff09;&#xff0c;在这个提示符号之后可以输入命令&#xff0c;Linux根据输入的命令会做回应&#xff0c;这一连串的动作是由一个所谓的Shell来做处理。Shel…

python读取word文档结构图_Word 有什么技巧,让你相见恨晚?

Word作为日常办公最常用的软件之一&#xff0c;其实真没你想得那么简单&#xff01;你不知道的每一个技巧&#xff0c;都会让你相见恨晚&#xff01;每当身边的小伙伴询问这些疑难杂症时&#xff0c;我都会抛出这张图…真的没骗你&#xff0c;我们遇到的 99% 的Word难题&#x…

Golang 特性简介

by sheepbao 主要大概介绍go语言的历史和特性&#xff0c;简单的入门。 来历 很久以前&#xff0c;有一个IT公司&#xff0c;这公司有个传统&#xff0c;允许员工拥有20%自由时间来开发实验性项目。在2007的某一天&#xff0c;公司的几个大牛&#xff0c;正在用c开发一些比较繁…

HTML实体字符转化为HTML标签

html_entity_decode方法 参数描述string必需。规定要解码的字符串。flags 可选。规定如何处理引号以及使用哪种文档类型。 可用的引号类型&#xff1a; ENT_COMPAT - 默认。仅解码双引号。ENT_QUOTES - 解码双引号和单引号。ENT_NOQUOTES - 不解码任何引号。规定所使用文档类型…

华为2017java笔试题_2017年java华为面试题

2017年java华为面试题通过HCNP认证&#xff0c;将证明您对中小型网络有全面深入的了解&#xff0c;掌握中小型网络的通用技术&#xff0c;并具备独立设计中小型网络以及使用华为路由交换设备实施设计的能力。下面是小编收集的关于java华为面试题&#xff0c;希望大家认真阅读!1…

Tomcat 配置详解/优化方案

Server.xml 【原地址&#xff1a;http://blog.csdn.net/cicada688/article/details/14451541】 Server.xml配置文件用于对整个容器进行相关的配置。 <Server>元素&#xff1a;是整个配置文件的根元素。表示整个Catalina容器。 属性&#xff1a;className&#xff1a;实现…

MySQL创建数据库与创建用户以及授权

1、create schema [数据库名称] default character set utf8 collate utf8_general_ci;--创建数据库 采用create schema和create database创建数据库的效果一样。 2、create user [用户名称]% identified by [用户密码];--创建用户 密码8位以上&#xff0c;包括&#xff1a;大写…

java 防止url重复请求_Web项目如何防止客户端重复发送请求

在Web项目中&#xff0c;有一些请求或操作会对数据产生影响(比如新增、删除、更新)&#xff0c;针对这类请求一般都需要做一些保护&#xff0c;以防止用户有意或无意的重复发起这样的请求导致的数据错乱。本文总结了一些防止客户端重复发送请求的方法。方法一&#xff1a;JS监听…

【bzoj1010-toy】斜率优化入门模板

dsy1010: [HNOI2008]玩具装箱 【题目描述】 有n个数&#xff0c;分成连续的若干段&#xff0c;每段&#xff08;假设从第j个到第i个组成一段&#xff09;的分数为 (X-L)^2&#xff0c;X为j-iSigma(Ck) i<k<j&#xff0c;其中L是一个常量。目标&#xff1a;各段分数的总和…

itellyou操作系统,office等软件的很全的下载站

itellyou操作系统&#xff0c;office等软件的很全的下载站http://www.itellyou.cn/转载于:https://blog.51cto.com/wangheyu1/1894724

矩阵的马鞍点

#include<stdio.h>#define n 4//马鞍点是第I行值最小第J列值最大 void maxmin(int a[n][n]){ int i,j ,flag; int max[n],min[n]; for(i0;i<n;i) { min[i]a[i][0];//将数组每行的第一个元素赋值给min[]数组 for(j1;j<n;j) { if(a[i][j]<min[i]) min[i]a[i][j];…

Linux运维工程师面试-部分题库

一、Linux操作系统知识 1.常见的Linux发行版本都有什么&#xff1f;你最擅长哪一个&#xff1f;它的官网网站是什么&#xff1f;说明你擅长哪一块&#xff1f; 2.Linux开机启动流程详细步骤是什么&#xff1f;系统安装完&#xff0c;忘记密码如何破解&#xff1f; 3.企业中Linu…

java统计系统线程数_Java并发(八)计算线程池最佳线程数

目录一、理论分析二、实际应用为了加快程序处理速度&#xff0c;我们会将问题分解成若干个并发执行的任务。并且创建线程池&#xff0c;将任务委派给线程池中的线程&#xff0c;以便使它们可以并发地执行。在高并发的情况下采用线程池&#xff0c;可以有效降低线程创建释放的时…

php大小写转换函数

1.将字符串转换成小写 strtolower(): 该函数将传入的字符串参数所有的字符都转换成小写,并以小定形式放回这个字 符串.例: <?php$str "I want To FLY";$str strtolower($str);echo $str; ?>输出结果: i want to fly 2.将字符转成大写 strtoupper(): 该…

关于移动端 1px 像素问题

移动端1px变粗的原因 移动端html的header总会有一句<meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno">这句话定义了本页面的viewport的宽度为设备宽度,初始缩放值和最大缩放值都为1,并禁止了…

java框架概念_java概念(2)

java概念(2)重载和重写重载&#xff1a;同一个类中&#xff0c;方法名相同&#xff0c;参数不同重写&#xff1a;父子类中&#xff0c;子类重新定义父类的方法多态​ 多态&#xff1a;同一种行为&#xff0c;不同的对象有不同的表现形式。​ 重载 编译时根据参数决定调用的方法…

CentOS(八)--crontab命令的使用方法

crontab命令常见于Unix和Linux的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于"crontab"文件中&#xff0c;以供之后读取和执行。 在Linux系统中&#xff0c;Linux任务调度的工作主要分为以下两类&…