zoukankan      html  css  js  c++  java
  • 洛谷P3145 [USACO16OPEN]分割田地Splitting the Field

    P3145 [USACO16OPEN]分割田地Splitting the Field

    题目描述

    Farmer John's NN cows (3 leq N leq 50,0003N50,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,00011,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;
    }
  • 相关阅读:
    SQL中利用脚本恢复数据库
    SQL中如何检查死锁
    三个有用的SQL辅助工具
    企业报销系统完整设计方案(三)
    企业报销系统完整设计方案(二)
    企业报销系统完整设计方案
    Crystal Report在.net中的两种显示方式
    cacti 流量图合并
    Centos 7 配置邮件发送
    Centos 7 Ntop 流量分析 安装
  • 原文地址:https://www.cnblogs.com/thmyl/p/7811510.html
Copyright © 2011-2022 走看看