Noi2011 : 智能车比赛
假设S在T左边,那么只能往右或者上下走
f[i]表示S到i点的最短路
f[i]=min(f[j]+dis(i,j)(i能看到j))
判断i能看到j就维护一个上凸壳和一个下凸壳
时间复杂度$O(n^2)$
代码写的有点长…
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 2010
using namespace std;
struct P{int x,y;P(){}P(int _x,int _y){x=_x,y=_y;}P operator-(const P&a){return P(x-a.x,y-a.y);}};
inline int cross(P a,P b){return a.x*b.y-a.y*b.x;}
inline double dis(P a,P b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
int n,i,X1[N],Y1[N],X2[N],Y2[N],xs,ys,xt,yt,st,en;
double v,f[N][4],ans,inf=1e9;
inline void call(int x,int y,int p,double&t){
t=inf;
P o(x,y),up(x,y+1),down(x,y-1),tmp;
for(int i=p-1;i>st;i--){
tmp=P(X2[i],Y2[i]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[i][3]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X2[i],Y1[i]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[i][2]+dis(o,tmp));//在up下边或者重合
}
tmp=P(X1[i],Y2[i]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[i][1]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X1[i],Y1[i]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[i][0]+dis(o,tmp));//在up下边或者重合
}
}
tmp=P(X2[st],Y2[st]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[st][3]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X2[st],Y1[st]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[st][2]+dis(o,tmp));//在up下边或者重合
}
tmp=P(xs,ys);
if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下边或者重合 在down上边或者重合
}
inline void calr(int x,int y,int p,double&t){
t=inf;
P o(x,y),up(x,y+1),down(x,y-1),tmp;
tmp=P(X1[p],Y2[p]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[p][1]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X1[p],Y1[p]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[p][0]+dis(o,tmp));//在up下边或者重合
}
for(int i=p-1;i>st;i--){
tmp=P(X2[i],Y2[i]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[i][3]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X2[i],Y1[i]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[i][2]+dis(o,tmp));//在up下边或者重合
}
tmp=P(X1[i],Y2[i]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[i][1]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X1[i],Y1[i]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[i][0]+dis(o,tmp));//在up下边或者重合
}
}
tmp=P(X2[st],Y2[st]);
if(cross(up-o,tmp-o)>=0){//在up下边或者重合
up=tmp;
if(cross(down-o,tmp-o)<=0)t=min(t,f[st][3]+dis(o,tmp));//在down上边或者重合
}
tmp=P(X2[st],Y1[st]);
if(cross(down-o,tmp-o)<=0){//在down上边或者重合
down=tmp;
if(cross(up-o,tmp-o)>=0)t=min(t,f[st][2]+dis(o,tmp));//在up下边或者重合
}
tmp=P(xs,ys);
if(cross(up-o,tmp-o)>=0&&cross(down-o,tmp-o)<=0)t=dis(o,tmp);//在up下边或者重合 在down上边或者重合
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d%d%d%d",&X1[i],&Y1[i],&X2[i],&Y2[i]);
scanf("%d%d%d%d",&xs,&ys,&xt,&yt);
if(xs>xt)swap(xs,xt),swap(ys,yt);
scanf("%lf",&v);
for(i=1;i<=n;i++)if(X1[i]<=xs&&xs<=X2[i]&&Y1[i]<=ys&&ys<=Y2[i]){st=i;break;}
for(i=n;i;i--)if(X1[i]<=xt&&xt<=X2[i]&&Y1[i]<=yt&&yt<=Y2[i]){en=i;break;}
f[st][2]=dis(P(xs,ys),P(X2[st],Y1[st]));
f[st][3]=dis(P(xs,ys),P(X2[st],Y2[st]));
for(i=st+1;i<en;i++){
call(X1[i],Y1[i],i,f[i][0]);
call(X1[i],Y2[i],i,f[i][1]);
calr(X2[i],Y1[i],i,f[i][2]);
calr(X2[i],Y2[i],i,f[i][3]);
}
call(X1[en],Y1[en],en,f[en][0]);
call(X1[en],Y2[en],en,f[en][1]);
calr(xt,yt,en,ans);
printf("%.10f",ans/v);
return 0;
}
Noi2011 : 智能车比赛的更多相关文章
- 2433: [Noi2011]智能车比赛 - BZOJ
Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...
- [NOI2011]智能车比赛 (计算几何 DAG)
/* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...
- [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 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以\( ...
- BZOJ 2433 智能车比赛(计算几何+最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2433 题意:若干个矩形排成一排(同一个x之上最多有一个矩形),矩形i和i+1相邻.给定两 ...
- 智能车学习(十五)——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& ...
随机推荐
- [ZJOI3527][Zjoi2014]力
[ZJOI3527][Zjoi2014]力 试题描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi.试求Ei. 输入 包含一个整数n,接下来n行每行输入一个数,第i行表示qi. 输出 有n ...
- 翻译:非常详细易懂的法线贴图(Normal Mapping)
翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...
- raspberry树莓派安装CUPS实现打印服务器共享HP P1007打印机
虽然很多文章提到了raspberry树莓派如何安装cups实现共享打印机服务,但是我自己试下来发现HP P1007总是无法使用,折腾了很久,终于找到了方法,记录一下. 默认raspberry树莓派已经 ...
- HDU 1069&&HDU 1087 (DP 最长序列之和)
H - Super Jumping! Jumping! Jumping! Time Limit:1000MS Memory Limit:32768KB 64bit IO Format: ...
- 【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?
网桥模式访问外网非常慢,经常卡死,ping时断时续 七搞八搞,反复重启了几次 TMD 就好了,也不知道什么情况,VirtualBox还是不太好使啊..... 网桥模式 设置 如下: 参考资料: ht ...
- 【Other】推荐点好听的钢琴曲
2013-12-13 16:19 匿名 | 浏览 138977 次 音乐钢琴 推荐点好听的钢琴曲,纯音乐也可以thanks!!! 2013-12-14 19:34 网友采纳 热心网友 巴洛克:帕海贝尔 ...
- firefox30浏览器,在使用quit()方法退出时,plugin-container.exe崩溃的问题
如题,崩溃截图如下: 解决办法: 对于版本号大于29的firefox,需要在其安装目录下,删除plugin-container.exe,不然使用webdriver的quit()方法关闭浏览器时会报错. ...
- sqlserver的执行计划
一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图: 1. 分析过程 这三个比较容易理解,首先我们要保证sql的语法不能错误,sele ...
- 【JAVA、C++】LeetCode 013 Roman to Integer
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- 一箭双雕打开Genesis
打开记事本,将如下内容填入,保存时将后缀名改为bat @ ECHO 正在清理垃圾文件...del C:\tmp\*.* /f /q@ ECHO 清理完毕@ ECHO OFF@ ECHO.@ ECHO. ...