题目链接: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的上下界,在该范围之内的点均可达。

  1. struct point
  2. {
  3. int x,y;
  4.  
  5. point(){}
  6. point(int _x,int _y)
  7. {
  8. x=_x;
  9. y=_y;
  10. }
  11.  
  12. void get()
  13. {
  14. RD(x,y);
  15. }
  16.  
  17. point operator-(point a)
  18. {
  19. return point(x-a.x,y-a.y);
  20. }
  21.  
  22. i64 operator*(point a)
  23. {
  24. return (i64)x*a.y-(i64)y*a.x;
  25. }
  26.  
  27. double len()
  28. {
  29. return sqrt(1.0*x*x+1.0*y*y);
  30. }
  31. };
  32.  
  33. struct node
  34. {
  35. point a,b,c,d;
  36.  
  37. void get()
  38. {
  39. int x1,y1,x2,y2;
  40. RD(x1,y1); RD(x2,y2);
  41. a=point(x1,y1);
  42. b=point(x1,y2);
  43. c=point(x2,y1);
  44. d=point(x2,y2);
  45. }
  46.  
  47. int contain(point p)
  48. {
  49. return a.x<=p.x&&p.x<=c.x&&a.y<=p.y&&p.y<=b.y;
  50. }
  51. };
  52.  
  53. double f[N],v,ans;
  54. node a[N];
  55. point S,T;
  56. int n;
  57.  
  58. double dis(point a,point b)
  59. {
  60. a=a-b;
  61. return a.len();
  62. }
  63.  
  64. i64 cross(point a,point b,point c)
  65. {
  66. return (b-a)*(c-a);
  67. }
  68.  
  69. int isCross(point a,point b,point c,point d)
  70. {
  71. if(b.x<a.x) return 0;
  72. return cross(a,c,b)<=0&&cross(a,d,b)>=0;
  73. }
  74.  
  75. void update(point S,int now,double p)
  76. {
  77. if(p>=dinf) return;
  78. point up=point(S.x,S.y+1);
  79. point down=point(S.x,S.y-1);
  80. point l,r;
  81. int i;
  82. for(i=now;i<n;i++)
  83. {
  84. if(isCross(S,a[i].a,up,down)) f[i*4]=min(f[i*4],p+dis(S,a[i].a));
  85. if(isCross(S,a[i].b,up,down)) f[i*4+1]=min(f[i*4+1],p+dis(S,a[i].b));
  86. if(isCross(S,a[i].c,up,down)) f[i*4+2]=min(f[i*4+2],p+dis(S,a[i].c));
  87. if(isCross(S,a[i].d,up,down)) f[i*4+3]=min(f[i*4+3],p+dis(S,a[i].d));
  88. if(a[i].contain(T)&&isCross(S,T,up,down)) ans=min(ans,p+dis(S,T));
  89. if(i+1<n)
  90. {
  91. l=point(a[i].c.x,max(a[i].c.y,a[i+1].a.y));
  92. r=point(a[i].d.x,min(a[i].d.y,a[i+1].b.y));
  93. if(a[i].c.x==S.x)
  94. {
  95. if(l.y>S.y||S.y>r.y)
  96. {
  97. f[(i+1)*4]=min(f[(i+1)*4],p+dis(S,a[i+1].a));
  98. f[(i+1)*4+1]=min(f[(i+1)*4+1],p+dis(S,a[i+1].b));
  99. return;
  100. }
  101. }
  102. else
  103. {
  104. if(cross(S,down,l)>0) down=l;
  105. if(cross(S,up,r)<0) up=r;
  106. if(cross(S,up,down)>0) return;
  107. }
  108. }
  109. }
  110. }
  111.  
  112. int main()
  113. {
  114. RD(n);
  115. int i;
  116. FOR0(i,n) a[i].get();
  117. S.get(); T.get();
  118. RD(v);
  119. if(S.x>T.x) swap(S,T);
  120. FOR0(i,4*n) f[i]=dinf;
  121. ans=dinf;
  122. FOR0(i,n)
  123. {
  124. if(a[i].contain(S)) update(S,i,0);
  125. update(a[i].a,i,f[i*4]);
  126. update(a[i].b,i,f[i*4+1]);
  127. update(a[i].c,i,f[i*4+2]);
  128. update(a[i].d,i,f[i*4+3]);
  129. }
  130. PR(ans/v);
  131. }

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. 夺命雷公狗---node.js---8url模块和util模块

    我们先到手册上看看: 上面很明显就写着返回一个对象. 再来看看util模块, 废话不哦多说,先上一点代码: /** * Created by leigood on 2016/8/13. */ var ...

  2. ThinkPHP讲解(八)——显示、修改、添加、删除

    一.显示数据 <h1>主页面</h1> <table width="100%" border="1" cellpadding=&q ...

  3. 安装kingroot之后的残留

    /system/usr/icu/icusuflag.conf/system/usr/ikm/ikmsu/system/usr/iku//system/usr/attrch/system/etc/ins ...

  4. 《zw版Halcon与delphi系列原创教程》发布说明

    <zw版Halcon与delphi系列原创教程>发布说明 zw转载的<台湾nvp系列halcon-delphi教程>,虽然很多,不过基本上都是从cnc.数控角度的demo..  ...

  5. Angularjs之controller 和filter(四)

    Controller组件(http://www.angularjs.cn/A00C) 在AngularJS中,控制器是一个Javascript函数(类型/类),用来增强除了根作用域以外的作用域实例的. ...

  6. android 项目学习随笔九(ListView加头布局)

    1.缓冲背景色 <ListView android:id="@+id/lv_list" android:layout_width="match_parent&quo ...

  7. 在路由器 RT-AC68U 安装迅雷远程过程

    赶紧记录下,省得时间久了忘记.  步骤如下: 1.下载迅雷远程的 Linux 组件: http://pan.baidu.com/s/1jGqYPnw . 解压缩. 2.ssh 登录au68u 路由器 ...

  8. STM32模拟I2C

    之前为了测试, 拿最小板做了一个I2C的主发跟主读, 一开始当然是尝试用硬件I2C, 结果弄了很久, 时间紧迫, 只好用了模拟, 结果发现, 哎, 真特么挺好用的, 现在1片儿顶过去5片儿. 硬件I2 ...

  9. linux与KVM虚拟里的windows实现文件共享

    1.把windows系统里的共享文件设置为共享 2.在linux系统里 mount -t cifs //192.168.0.254/work /data/tmp -o username=test,pa ...

  10. http 报文 - 转

    1. http 报文 2. HTTP报文