2018 “百度之星”程序设计大赛 - 初赛(B)1006 rect

Bryce1010模板

1006 rect
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=826&pid=1006

题意:

给定一个矩形和矩形的点,问你点到边界连线的距离最小总和时多少,要求连线不能相交不能重合。

思路:对于任一条矩形的横向扫描线和纵向扫描线,只有可能存在两条边,切两边变不可能重合。
可以将开进横向边的边划为横向点,其他的划为纵向点。
对于任一条横向扫描线,如果有两个横向点存在,则使得更近的获得最短距离,另一个点到对面那条边的距离。
纵向扫面线同理。

(可能我考虑复杂了)

#include

using namespace std;
#define ll long long

const int MAXN=1e6+10;
vector<int>vecx[MAXN];
vector<int>vecy[MAXN];



int main()
{
    int Mx,My,n;
    int x,y;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<=MAXN;i++)
        {
            vecx[i].clear();
            vecy[i].clear();
        }
        scanf("%d%d%d",&Mx,&My,&n);
        ///Mx--,My--;
        for(int i=0;iscanf("%d%d",&x,&y);
            int lenx=min(x,Mx-x);
            int leny=min(y,My-y);
            if(lenx<=leny)
                vecx[x].push_back(lenx);
            else vecy[y].push_back(leny);
        }




        ll ans=0;

        for(int i=0;i<=Mx;i++)
        {
            if(vecx[i].size()==2)
            {
                if(vecx[i][0]<=vecx[i][1])
                    ans+=vecx[i][0]+(Mx-vecx[i][1]);
                else ans+=vecx[i][1]+(Mx-vecx[i][0]);
            }
            else if(vecx[i].size()==1)
            {
                ans+=vecx[i][0];
            }
        }

        for(int i=0;i<=My;i++)
        {
            if(vecy[i].size()==2)
            {
                if(vecy[i][0]<=vecy[i][1])
                {
                    ans+=vecy[i][0]+(My-vecy[i][1]);
                }
                else ans+=vecy[i][1]+(My-vecy[i][0]);
            }
            else if(vecy[i].size()==1)
            {
                ans+=vecy[i][0];
            }
        }
        cout<0;

    }

    return 0;
}

你可能感兴趣的:(2018 “百度之星”程序设计大赛 - 初赛(B)1006 rect)