ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

USACO 2016 US Open Contest Gold T1: Splitting the Field

2019-07-20 18:50:28  阅读:261  来源: 互联网

标签:Node Gold Contest int ll min Splitting 围栏 MAXN


题目大意

在一个二维的牧场中,Farmer John的N(3<=N<=50000)头牛都各占一席。他想用边平行于x轴和y轴的矩形围栏围住所有牛,并且要让围栏尽可能小(牛可以在边界线上)。

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

题目分析

明显地,我们只需要先预处理出 每个点上下的最大与最小的横坐标 与 每个点左右最大与最小的纵坐标。

然后对每个点扫一遍,计算一下以这个点 左右分 & 上下分 所得的面积,取个min就行。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int MAXN=5e4+10;
 5 const ll Inf=1e18+7;
 6 struct Node{
 7     ll x,y;
 8 }a[MAXN],b[MAXN];
 9 
10 int n;
11 ll ans1,ans2;
12 inline bool cmpx(Node a,Node b){
13     return a.x<b.x;
14 } 
15 inline bool cmpy(Node a,Node b){
16     return a.y<b.y;
17 }
18 
19 ll amaxy_l[MAXN],aminy_l[MAXN],amaxy_r[MAXN],aminy_r[MAXN];
20 ll bminx_u[MAXN],bmaxx_u[MAXN],bmaxx_d[MAXN],bminx_d[MAXN];
21 int main(){
22     scanf("%d",&n);
23     for(int i=1;i<=n;++i){
24         scanf("%lld%lld",&a[i].x,&a[i].y);
25         b[i]=a[i];
26     }
27     sort(a+1,a+n+1,cmpx);
28     sort(b+1,b+n+1,cmpy);
29     
30     aminy_l[0]=0x7fffffff;bminx_d[0]=0x7fffffff;
31     for(int i=1;i<=n;++i){
32         aminy_l[i]=min(aminy_l[i-1],a[i].y);amaxy_l[i]=max(amaxy_l[i-1],a[i].y);
33         bminx_d[i]=min(bminx_d[i-1],b[i].x);bmaxx_d[i]=max(bmaxx_d[i-1],b[i].x);
34     }
35     
36     aminy_r[n+1]=0x7fffffffffff;bminx_u[n+1]=0x7fffffffffff;
37     for(int i=n;i>=1;--i){
38         aminy_r[i]=min(aminy_r[i+1],a[i].y);amaxy_r[i]=max(amaxy_r[i+1],a[i].y);
39         bminx_u[i]=min(bminx_u[i+1],b[i].x);bmaxx_u[i]=max(bmaxx_u[i+1],b[i].x);
40     }
41     
42     ll ee=a[n].x,ww=a[1].x,nn=b[n].y,ss=b[1].y;
43     ans1=(nn-ss)*(ee-ww);
44     ans2=0x7fffffffffffffff;
45     for(int i=1;i<n;++i){
46         ll ta=(a[i].x-ww)*(amaxy_l[i]-aminy_l[i])+(ee-a[i+1].x)*(amaxy_r[i+1]-aminy_r[i+1]);
47         ll tb=(nn-b[i].y)*(bmaxx_u[i]-bminx_u[i])+(b[i-1].y-ss)*(bmaxx_d[i-1]-bminx_d[i-1]);
48         ans2=min(ans2,min(ta,tb));
49     }
50     printf("%lld\n",ans1-ans2);
51     return 0;
52 }

 

标签:Node,Gold,Contest,int,ll,min,Splitting,围栏,MAXN
来源: https://www.cnblogs.com/LI-dox/p/11218778.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有