您的位置:首页 > 产品设计 > UI/UE

BZOJ 1696: [Usaco2007 Feb]Building A New Barn新牛舍

2016-11-01 11:38 573 查看
把x和y分开并不影响结果。。

分别排序找中位数,找到的x,y就是点的坐标

如果这个点刚好有牛就判断这个点周围4个点

中位数有俩,那末在x∈[x1,x2],y∈[y1,y2]范围里的点都是可行的,然后去掉这之间有牛的点。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define g getchar()
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
ll x=0,f=1;char ch=g;
for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';
return x*f;
}
inline void out(ll x){
int a[25],t=0;
if(x<0)putchar('-'),x=-x;
for(;x;x/=10)a[++t]=x%10;
for(int i=t;i;--i)putchar('0'+a[i]);
if(t==0)putchar('0');
putchar('\n');
}
int n,ans,an[5],c;
int fx[5]={0,1,-1,0,0},fy[5]={0,0,0,1,-1};
struct re{int x,y;}a[10005];
inline bool cmpx(re x,re y){return x.x==y.x?x.y<y.y:x.x<y.x;}
inline bool cmpy(re x,re y){return x.y==y.y?x.x<y.x:x.y<y.y;}
bool check(int x,int y){
for(int i=1;i<=n;++i)if(a[i].x==x&&a[i].y==y)return 0;
return 1;
}
int main(){
n=read();
for(int i=1;i<=n;++i){
a[i].x=read(),a[i].y=read();
}
if(n&1){
sort(a+1,a+1+n,cmpx);int x=a[(n>>1)+1].x;
sort(a+1,a+1+n,cmpy);int y=a[(n>>1)+1].y;
if(check(x,y)){
for(int i=1;i<=n;++i)ans+=abs(x-a[i].x)+abs(y-a[i].y);
printf("%d %d\n",ans,1);
return 0;
}
else{
for(int i=1;i<=n;++i)
for(int j=1;j<=4;++j)an[j]+=abs(x+fx[j]-a[i].x)+abs(y+fy[j]-a[i].y);
ans=inf;
for(int i=1;i<=4;++i)if(an[i]<ans)ans=an[i],c=1;else if(an[i]==ans)++c;
printf("%d %d\n",ans,c);
return 0;
}
}
else{
sort(a+1,a+1+n,cmpx);int x1=a[n>>1].x,x2=a[(n>>1)+1].x;
sort(a+1,a+1+n,cmpy);int y1=a[n>>1].y,y2=a[(n>>1)+1].y;
c=(x2-x1+1)*(y2-y1+1);
for(int i=1;i<=n;++i){
if(a[i].x>=x1&&a[i].x<=x2&&a[i].y>=y1&&a[i].y<=y2)--c;
ans+=abs(x1-a[i].x)+abs(y1-a[i].y);
}
printf("%d %d\n",ans,c);return 0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: