poj 3269 Building A New Barn

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

using namespace std;

const int maxn=1e4+9;

int x[maxn],y[maxn];

struct D

{

    int x,y;

    bool operator <(const D &xx)const

    {

        if(x==xx.x)

        return y<xx.y;

        return x<xx.x;

    }

}point[maxn];



int abs(int a)

{

    if(a<0) return -a;

    return a;

}



int main()

{

//    freopen("in.txt","r",stdin);

    int n;

    scanf("%d",&n);

    for(int i=1;i<=n;i++)

    {

        scanf("%d %d",&x[i],&y[i]);

        point[i].x=x[i];

        point[i].y=y[i];

    }

    sort(x+1,x+1+n);

    sort(y+1,y+1+n);

    sort(point+1,point+1+n);

    int ans=0;

    long long sum=0;

    if(n&1||(x[n>>1]==x[n+2>>1]&&y[n>>1]==y[n+2>>1]))

    {

        bool flag=false;

        int xx=x[n+1>>1],yy=y[n+1>>1];

        for(int k=1;k<=n;k++)

        if(point[k].x==xx&&point[k].y==yy)

        flag=true;

        if(!flag)

        {

            for(int i=1;i<=n;i++)

            {

                sum+=abs(x[i]-xx);

                sum+=abs(y[i]-yy);

            }

            printf("%lld %d\n",sum,1);

        }

        else

        {

            for(int i=1;i<=n;i++)

            {

                sum+=abs(x[i]-(xx+1));

                sum+=abs(y[i]-yy);

            }

            long long ret=sum,tmp=1;

            sum=0;

            for(int i=1;i<=n;i++)

            {

                sum+=abs(x[i]-(xx-1));

                sum+=abs(y[i]-yy);

            }

            if(sum==ret) tmp++;

            else if(sum<ret) ret=sum;

            sum=0;

            for(int i=1;i<=n;i++)

            {

                sum+=abs(x[i]-xx);

                sum+=abs(y[i]-(yy+1));

            }

            if(sum==ret) tmp++;

            else if(sum<ret) ret=sum;

            sum=0;

            for(int i=1;i<=n;i++)

            {

                sum+=abs(x[i]-xx);

                sum+=abs(y[i]-(yy-1));

            }

            if(sum==ret) tmp++;

            else if(sum<ret) ret=sum;

            printf("%lld %d\n",sum,tmp);

        }

    }

    else

    {

        for(int i=1;i<=n;i++)

        {

            sum+=abs(x[i]-x[n>>1]);

            sum+=abs(y[i]-y[n>>1]);

        }

        int k=1;

        for(int i=x[n>>1];i<=x[n+2>>1];i++)

        for(int j=y[n>>1];j<=y[n+2>>1];j++)

        {

            for(;point[k].x<i||(point[k].x==i&&point[k].y<j);k++);

            if(point[k].x!=i||point[k].y!=j) ans++;

        }

        printf("%lld %d\n",sum,ans);

    }

    return 0;

}



你可能感兴趣的:(Build)