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& ...
随机推荐
- 夺命雷公狗---在js里阻止a标签的跳转和form表单的跳转
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 夺命雷公狗---DEDECMS----16dedecms取出首页今日更新
我们这次就要来取出我们的电影和电视剧以及综艺节目: 我们首先在我们受页面的模版文件中获取电影和电视剧的标签: 我们发现这里有一大堆,我只留一个即可: 然后我们到后台更新下首页的模版,看下是否只有一个模 ...
- 夺命雷公狗---DEDECMS----15dedecms首页栏目列表页导航部分完成
我们在点击导航页面的连接时候我们需要我们的连接跳到指定的模版页面,而不是随便跳到一个指定的A连接标签: 所以我们首先要将前端给我们的栏目列表模版拷贝到目录下,然后就可以创建栏目列表页面了,但是名字我们 ...
- linux网站目录及Apache权限的设置
apache服务器访问权限设置禁止所有访问:Options Indexes FollowSymLinks 改为 Option None Apache单个或多个目录禁止访问方法 这种方法通常用来 ...
- Delphi内嵌汇编语言BASM精要(转帖)
1 BASM概念简要 汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb // 单指令语句 jmp @Here // 一个表达式: ...
- Spring事务注解@Transactional回滚问题
Spring配置文件,声明事务时,如果rollback-for属性没有指定异常或者默认不写:经测试事务只回滚运行时异常(RuntimeException)和错误(Error). <!-- 配置事 ...
- Linux异步IO【转】
转自:http://blog.chinaunix.net/uid-24567872-id-87676.html Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出 ...
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据
1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...
- 【转载】使用barman备份PostgreSQL
什么是barman Barman (备份和恢复管理器) 是 PostgreSQL 数据库服务器中非常方便的备份和恢复工具,允许远程备份多个服务器,允许从一个备份集中一个命令就恢复数据库.同时还可以对多 ...
- android中文件操作的四种枚举
1.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用自身访问,在该模式下,写入的的内容会覆盖原文件中的内容. 2.MODE_APPEND:该模式会检查文件是否存在,存在就往文件 ...