P3145 [USACO16OPEN]分割田地Splitting the Field

题目描述

Farmer John‘s NN cows (3 \leq N \leq 50,0003≤N≤50,000) are all located at distinct positions in his two-dimensional field. FJ wants to enclose all of the cows with a rectangular fence whose sides are parallel to the x and y axes, and hewants this fence to be as small as possible so that it contains every cow (cowson the boundary are allowed).

FJ is unfortunately on a tight budget due to low milk production last quarter.He would therefore like to enclose a smaller area to reduce maintenance costs,and the only way he can see to do this is by building two enclosures instead of one. Please help him compute how much less area he needs to enclose, in total,by using two enclosures instead of one. Like the original enclosure, the two enclosures must collectively contain all the cows (with cows on boundaries allowed), and they must have sides parallel to the x and y axes. The two enclosures are not allowed to overlap -- not even on their boundaries. Note that enclosures of zero area are legal, for example if an enclosure has zero width and/or zero height.在一个二维的牧场中,Farmer John的N(3<=N<=50000)头牛都各占一席。他想用边平行于x轴和y轴的矩形围栏围住所有牛,并且要让围栏尽可能小(牛可以在边界线上)。

不幸地,由于Farmer John的奶牛产量惨淡,导致最后一个季度预算紧张。因此,他希望封闭一个较小的地区来减少维修的费用,他能看到的唯一方法就是修建两个围栏而不是建一个。请编程告诉他用两个围栏比用一个围栏总共能够节省多少需要围住的面积。同样地,用两个围栏的时候必须围住所有的牛(牛同样可以在边界上),边也要平行于x轴和y轴。两个围栏不允许重叠(边界也不能)。注意面积为零是合法的,例如一个围栏有着长度为零的宽或长度为零的长(一条线)。

输入输出格式

输入格式:

The first line of input contains NN. The next NN lines each contain two

integers specifying the location of a cow. Cow locations are positive integers

in the range 1 \ldots 1,000,000,0001…1,000,000,000.

输出格式:

Write a single integer specifying amount of total area FJ can save by using two

enclosures instead of one.

输入输出样例

输入样例#1: 复制

6
4 2
8 10
1 1
9 12
14 7
2 3

输出样例#1: 复制

107
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50010
#define INF 0x7fffffff
int l[maxn],r[maxn],l1[maxn],r1[maxn],n;
long long ans;
struct node{
    int x,y;
    bool operator < (const node a)const{
        if(x==a.x)return y<a.y;
        return x<a.x;
    }
}p[maxn];
void work(){
    memset(l,127,sizeof(l));
    memset(r,-127,sizeof(r));
    memset(l1,127,sizeof(l1));
    memset(r1,-127,sizeof(r1));
    sort(p+1,p+n+1);
    for(int i=1;i<=n;i++){
        l[i]=min(l[i-1],p[i].y);
        r[i]=max(r[i-1],p[i].y);
    }
    for(int i=n;i>=1;i--){
        l1[i]=min(l1[i+1],p[i].y);
        r1[i]=max(r1[i+1],p[i].y);
    }
    for(int i=2;i<=n;i++){
        long long tem=1LL*(r[i-1]-l[i-1])*(p[i-1].x-p[1].x)+1LL*(r1[i]-l1[i])*(p[n].x-p[i].x);
        ans=min(tem,ans);
    }
}
int main(){
    int mnx=INF,mny=INF,mxx=-INF,mxy=-INF;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&p[i].x,&p[i].y);
        mnx=min(mnx,p[i].x);mny=min(mny,p[i].y);
        mxx=max(mxx,p[i].x);mxy=max(mxy,p[i].y);
    }
    ans=1LL*(mxx-mnx)*(mxy-mny);
    long long ans1=ans;
    work();
    for(int i=1;i<=n;i++)swap(p[i].x,p[i].y);
    work();
    cout<<ans1-ans;
    return 0;
}

  

原文地址:https://www.cnblogs.com/xiongchongwen/p/11156523.html

时间: 2024-11-09 00:45:50

P3145 [USACO16OPEN]分割田地Splitting the Field的相关文章

洛谷P3145 [USACO16OPEN]分割田地Splitting the Field

P3145 [USACO16OPEN]分割田地Splitting the Field 题目描述 Farmer John's NN cows (3 \leq N \leq 50,0003≤N≤50,000) are all located at distinct positions in his two-dimensional field. FJ wants to enclose all of the cows with a rectangular fence whose sides are pa

bzoj4578: [Usaco2016 OPen]Splitting the Field

bzoj4578: [Usaco2016 OPen]Splitting the Field Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 56  Solved: 15[Submit][Status][Discuss] Description Farmer John's N cows (3≤N≤50,000) are all located at distinct positions in his two-dimensional fie ld. F

[jzoj]2938.【NOIP2012模拟8.9】分割田地

Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分给这些儿子.分给每个儿子的土地最小的单位是一个栅格,同时,分给同一个儿子的土地要求要相邻连续的.地主觉得分给某个儿子的土地面积至少有一个栅格,但是具体多少可以随意. 请问,聪明的你,能够算出地主一共有多少种分土地的方法吗?也就是说要求把2*n的栅格分成k个连通区域,每个区域至少有一个栅格. Solu

[编程题] 分田地

牛牛和 15 个朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值.分割田地的方法是横竖各切三刀,分成 16 份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地, 作为牛牛最好的朋友,你希望牛牛取得的田地的价值和尽可能大,你知道这个值最大可以是多少吗? 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 75),表示田地的大小,接下来的 n 行,每行包含 m 个 0-9 之间的数

linux下部分文件管理类基本命令汇总以及bash展开特性介绍

一.文件管理类基本命令 1.1.表格汇总 今天要讲解的命令如下表所示,按照外部命令和内建命令做基本划分: 内建命令列表: 命令名字 基本说明 file 检测文件类型 cd 改变shell的工作目录 dirs 显示目录堆栈信息 popd 从堆栈中移除目录 pushd 向堆栈中添加目录 外部命令列表: 命令名字 基本说明 ls 列出目录内容 tree 以"树状"格式列出目录内容 pwd 打印当前工作路径的名字(是一个绝对路径) echo 显示文本行 cat 连接文件内容,并打印到标准输出

Python Day19-20(Django基础)

一.Django基础 1.基本配置补充 可以用pycharm一键创建工程和APP 其他常用命令: python manage.py runserver 1.1.1.1:8000 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser 数据库配置 setting

python第一百零五天 ---Django 基础

一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+).html',views.detail),#动态路由 views.py def detail(request,nid) url(r'^detail-(\d+)_(\d+).html',views.detail),#动态路由 def detail(request,nid,uid) 3 url(r'^de

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

django框架&lt;二&gt;

django框架:   Models 1.基本创建 Django提供了一个抽象层("Model")的构建和管理Web应用程序的数据. Django使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). 每个模型是一个Python类,子类django.db.models.model 模型中的每个属性代表一个数据库字段. # DEMO class Student(models.Model): name = models.CharField(m