poj3714 Raid

这题WA很久,本人还随机了100个样例来测试,结果全过(白浪费我一个小时)

然后看了讨论区,就用C++提交了一遍,,于是,,过了,大家记得用C++交一遍

输出的时候注意G++对%f和%lf的区别,,,,据说是这样(大神轻拍)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define station 1
#define agent 2
#define MAX 100010
const double D_MAX=1e100;
struct point
{
    double x;
    double y;
    int belong;
};
point node[MAX*2];
point y[MAX*2];
bool cmp1(point a,point b)
{
    return a.x<b.x;
}
bool cmp2(point a,point b)
{
    return a.y<b.y;
}
double cal(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
double fin(int l,int r)
{
    if(l==r)
    {
        return D_MAX;
    }
    if(r-l==1)
    {
        if(node[l].belong+node[r].belong==3)
        {
            return cal(node[l],node[r]);
        }
        else
        {
            return D_MAX;
        }
    }
    double res;
    if(r-l==2)
    {
        double d[3];
        if(node[l].belong+node[l+1].belong==3)
        {
            d[0]=cal(node[l],node[l+1]);
        }
        else
        {
            d[0]=D_MAX;
        }
        if(node[l+1].belong+node[r].belong==3)
        {
            d[1]=cal(node[l+1],node[r]);
        }
        else
        {
            d[1]=D_MAX;
        }
        if(node[l].belong+node[r].belong==3)
        {
            d[2]=cal(node[l],node[r]);
        }
        else
        {
            d[2]=D_MAX;
        }
        res=d[0];
        res=res<d[1]?res:d[1];
        res=res<d[2]?res:d[2];
        return res;
    }
    int m=(l+r)/2;
    double left=fin(l,m);
    double right=fin(m+1,r);
    res=left<right?left:right;
    int len=0;
    int i;
    for(i=l;i<=r&&fabs(node[i].x-node[m].x)<res;i++)
    {
        y[len++]=node[i];
    }
    int j;
    sort(y,y+len,cmp2);
    for(i=0;i<len;i++)
    {
        for(j=i+1;j<len;j++)
        {
            if(y[j].y-y[i].y>=res)
            {
                break;
            }
            double temp;
            if(y[i].belong+y[j].belong==3)
            {
                temp=cal(y[i],y[j]);
            }
            else
            {
                temp=D_MAX;
            }
            if(temp<res)
            {
                res=temp;
            }
        }
    }
    return res;
}
int main()
{
    int i;
    int total;
    scanf("%d",&total);
    while(total--)
    {
        int n;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%lf %lf",&node[i].x,&node[i].y);
            node[i].belong=station;
        }
        for(i=n;i<2*n;i++)
        {
            scanf("%lf %lf",&node[i].x,&node[i].y);
            node[i].belong=agent;
        }
        sort(node,node+2*n,cmp1);
        double res=fin(0,2*n-1);
        printf("%.3lf\n",res);
    }
    return 0;
}

posted @ 2012-07-14 17:00  willzhang  阅读(258)  评论(0编辑  收藏  举报