题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433

题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻。给定两点S和T,两点均在矩形内。求S到T的最短路径。只能在矩形内部走。

思路:首先,S到T若有转弯,必定是在矩形 的顶点处转弯。因此,只要建立任意两可达顶点(包含S和T)之间距离求最短路即可。若暴力枚举任意两点再判是否可达复杂度O(n^3)。优化。枚举起点 a,从左向右扫遍矩形,利用叉积维护关于该点a的上下界,在该范围之内的点均可达。

struct point
{
    int x,y;

    point(){}
    point(int _x,int _y)
    {
        x=_x;
        y=_y;
    }

    void get()
    {
        RD(x,y);
    }

    point operator-(point a)
    {
        return point(x-a.x,y-a.y);
    }

    i64 operator*(point a)
    {
        return (i64)x*a.y-(i64)y*a.x;
    }

    double len()
    {
        return sqrt(1.0*x*x+1.0*y*y);
    }
};

struct node
{
    point a,b,c,d;

    void get()
    {
        int x1,y1,x2,y2;
        RD(x1,y1); RD(x2,y2);
        a=point(x1,y1);
        b=point(x1,y2);
        c=point(x2,y1);
        d=point(x2,y2);
    }

    int contain(point p)
    {
        return a.x<=p.x&&p.x<=c.x&&a.y<=p.y&&p.y<=b.y;
    }
};

double f[N],v,ans;
node a[N];
point S,T;
int n;

double dis(point a,point b)
{
    a=a-b;
    return a.len();
}

i64 cross(point a,point b,point c)
{
    return (b-a)*(c-a);
}

int isCross(point a,point b,point c,point d)
{
    if(b.x<a.x) return 0;
    return cross(a,c,b)<=0&&cross(a,d,b)>=0;
}

void update(point S,int now,double p)
{
    if(p>=dinf) return;
    point up=point(S.x,S.y+1);
    point down=point(S.x,S.y-1);
    point l,r;
    int i;
    for(i=now;i<n;i++)
    {
        if(isCross(S,a[i].a,up,down)) f[i*4]=min(f[i*4],p+dis(S,a[i].a));
        if(isCross(S,a[i].b,up,down)) f[i*4+1]=min(f[i*4+1],p+dis(S,a[i].b));
        if(isCross(S,a[i].c,up,down)) f[i*4+2]=min(f[i*4+2],p+dis(S,a[i].c));
        if(isCross(S,a[i].d,up,down)) f[i*4+3]=min(f[i*4+3],p+dis(S,a[i].d));
        if(a[i].contain(T)&&isCross(S,T,up,down)) ans=min(ans,p+dis(S,T));
        if(i+1<n)
        {
            l=point(a[i].c.x,max(a[i].c.y,a[i+1].a.y));
            r=point(a[i].d.x,min(a[i].d.y,a[i+1].b.y));
            if(a[i].c.x==S.x)
            {
                if(l.y>S.y||S.y>r.y)
                {
                    f[(i+1)*4]=min(f[(i+1)*4],p+dis(S,a[i+1].a));
                    f[(i+1)*4+1]=min(f[(i+1)*4+1],p+dis(S,a[i+1].b));
                    return;
                }
            }
            else
            {
                if(cross(S,down,l)>0) down=l;
                if(cross(S,up,r)<0) up=r;
                if(cross(S,up,down)>0) return;
            }
        }
    }
}

int main()
{
    RD(n);
    int i;
    FOR0(i,n) a[i].get();
    S.get(); T.get();
    RD(v);
    if(S.x>T.x) swap(S,T);
    FOR0(i,4*n) f[i]=dinf;
    ans=dinf;
    FOR0(i,n)
    {
        if(a[i].contain(S)) update(S,i,0);
        update(a[i].a,i,f[i*4]);
        update(a[i].b,i,f[i*4+1]);
        update(a[i].c,i,f[i*4+2]);
        update(a[i].d,i,f[i*4+3]);
    }
    PR(ans/v);
}

BZOJ 2433 智能车比赛(计算几何+最短路)的更多相关文章

  1. [NOI2011]智能车比赛 (计算几何 DAG)

    /* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...

  2. 2433: [Noi2011]智能车比赛 - BZOJ

    Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...

  3. Noi2011 : 智能车比赛

    假设S在T左边,那么只能往右或者上下走 f[i]表示S到i点的最短路 f[i]=min(f[j]+dis(i,j)(i能看到j)) 判断i能看到j就维护一个上凸壳和一个下凸壳 时间复杂度$O(n^2) ...

  4. [bzoj2433][Noi2011]智能车比赛

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2433 http://221.192.240.123:8586/JudgeOnline/ ...

  5. 【[NOI2011]智能车比赛】(建图+spfa+坑爹精度)

    过了这题我就想说一声艹,跟这个题死磕了将近6个小时,终于是把这个题死磕出来了.首先看到这个题的第一反应,和当初做过的一个房间最短路比较相似,然后考虑像那个题那样建边,然后跑最短路.(具体建边方法请参考 ...

  6. 【LOJ】#2443. 「NOI2011」智能车比赛

    题解 显然是个\(n^2\)的dp 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以\( ...

  7. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  8. K60平台智能车开发工作随手记

    (图片仅为示例,并不一定固定为这种造型) 第十二届全国大学生智能汽车竞赛有一个分项是光电四轮车的竞速(任务A),Seven她们组采购到的配件使用了freescale Crotex-M4内核的CPU,T ...

  9. 【sky第二期--PID算法】--【智能车论坛】

    [sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...

随机推荐

  1. 夺命雷公狗ThinkPHP项目之----企业网站10之栏目的编辑完善(无限极分类的完成)

    我们编辑首先就要考虑将下拉框效果实现出来,然后再进行下一步操作: 我们用到了Model层的操作,在第8讲里面其实已经写好了catTree方法,控制器如下所示: 然后在列表页然他变量进行输出 然后开始通 ...

  2. 【rails3教材】博客构建过程2

    2. 使用脚手架快速搭建网页 rails的脚手架可以快速生成应用程序的一些片段,如果你需要为一个资源创建一系列的控制器视图模型,那么脚手架就是你需要的工具 3. 创建资源 对于一个博客程序,你可以以生 ...

  3. js获取单选框radio的值

    遇到一个js获取radio值的问题,原来根据frm.type.value取到的值在ie下是空值 解决办法:type为每个radio的值 var chkObjs=document.getElements ...

  4. Java :List

    1.List是一个接口,不能实例化,需要实例化一个ArrayList或者LinkedListList myList = new ArrayList(); 2.List中可以添加任何对象,包括自己定义的 ...

  5. 【水题】NOIP201504推销员

    NOIP201504推销员 [问题描述]   阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 ...

  6. 使用javascript判断浏览器对css3的支持情况【译】

    Quick Tip: Detect CSS3 Support in Browsers with JavaScript Jeffrey Way on Nov 15th 2010  步骤 1 首先我们要确 ...

  7. React Native 开发笔记

    ReactNativeDemo 学习ReactNative开发,搭建ReactNative第一个项目 React Native 开发笔记 1.安装Homebrew $ /usr/bin/ruby -e ...

  8. Web前端工作2个月小结

    开始语: 2013年6月30日,Microsoft Learning support 项目结束,转而进入Forerunner Development 项目,这对于这块领域空白的我,空前的困难,可是我坚 ...

  9. hdu 1016 Prime Ring Problem(深度优先搜索)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. win7里边使用telnet命令提示telnet不是内部或外部命令

    Win7默认没有安装telnet功能,所以你直接用telnet命令是用不了的: 你可以去“控制面板”-->“程序”(在左下角)--->“打开或关闭Windows功能”,勾上“telnet客 ...