BZOJ 2433 智能车比赛(计算几何+最短路)
题目链接: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 智能车比赛(计算几何+最短路)的更多相关文章
- [NOI2011]智能车比赛 (计算几何 DAG)
/* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...
- 2433: [Noi2011]智能车比赛 - BZOJ
Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...
- Noi2011 : 智能车比赛
假设S在T左边,那么只能往右或者上下走 f[i]表示S到i点的最短路 f[i]=min(f[j]+dis(i,j)(i能看到j)) 判断i能看到j就维护一个上凸壳和一个下凸壳 时间复杂度$O(n^2) ...
- [bzoj2433][Noi2011]智能车比赛
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2433 http://221.192.240.123:8586/JudgeOnline/ ...
- 【[NOI2011]智能车比赛】(建图+spfa+坑爹精度)
过了这题我就想说一声艹,跟这个题死磕了将近6个小时,终于是把这个题死磕出来了.首先看到这个题的第一反应,和当初做过的一个房间最短路比较相似,然后考虑像那个题那样建边,然后跑最短路.(具体建边方法请参考 ...
- 【LOJ】#2443. 「NOI2011」智能车比赛
题解 显然是个\(n^2\)的dp 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以\( ...
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- K60平台智能车开发工作随手记
(图片仅为示例,并不一定固定为这种造型) 第十二届全国大学生智能汽车竞赛有一个分项是光电四轮车的竞速(任务A),Seven她们组采购到的配件使用了freescale Crotex-M4内核的CPU,T ...
- 【sky第二期--PID算法】--【智能车论坛】
[sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...
随机推荐
- 夺命雷公狗TP下关联查询
记录下我们常用的关联查询: public function add4(){ $id=$_GET['id']; $this->list = M("student")->t ...
- JTAG
JTAG是JOINT TEST ACTION GROUP的简称,JTAG的两个标准IEEE 1149.1(2001)和IEEE 1149.7(2009). JTAG中主要包含两部分内容:TAP(TES ...
- ASP.NET MVC (一)
工作清闲好一段时间了,趁这段时间弄了弄PHP,做个了简单的MVC网页.玩了玩Android,弄了个拨号器,发短信的,嘿嘿,最满意的还是两天弄了个数独游戏.不务正业一个多月了,也该磨磨刀,接下来一段时间 ...
- Visual Studio 2012 怪异的自动重启
学生在做项目的过程中遇到这种问题: -------------- 用 Visual Studio 2012 开发W中eb 项目时,最近总是莫名其妙的自动重启. 后来试了一下,发现是只要在页面中输入 ...
- sql数据库(资料库)的基本操作
1 Character Set与Collation 任何资讯技术在处理资料的时候,如果只是单纯的数值和运算,那就不会有太复杂的问题:如果处理的资料是文字的话,就会面临世界上各种不同语言的问题.以资料库 ...
- Intel Edison 参考链接2
Edison的breakout板子的引脚: http://iotdk.intel.com/docs/master/mraa/java/edison.html Edison的引脚 http://www. ...
- linux下rm命令修改,增加回收站功能【笔记】
一个脚本,linux的用户根目录下.bashrc最后加入如下代码,可以修改rm命令,让人们rm时候不再会全部删除,而是会加入到回收站里,以下是根据别人的资料参考修改的,不是原创 加入后,需要sourc ...
- Java局部变量final
局部变量和形参带final. 在一个线程A中开起另一个线程B,如果线程B要使用线程A的局部变量,那么A的局部变量需要定义成final.理由:局部变量是线程内部共享的,每一个线程内的不能访问其他线程的局 ...
- PHP中使用数组指针函数操作数组示例
数组的内部指针是数组内部的组织机制,指向一个数组中的某个元素.默认是指向数组中第一个元素通过移动或改变指针的位置,可以访问数组中的任意元素.对于数组指针的控制PHP提供了以下几个内建函数可以利用. ★ ...
- 微信公众平台消息接口API指南
简介 微信公众平台消息接口为开发者提供了一种新的消息处理方式.微信公众平台消息接口为开发者提供与用户进行消息交互的能力.对于成功接入消息接口的微信公众账号,当用户发消息给公众号,微信公众平台服务器会使 ...