[bzoj2433][Noi2011]智能车比赛
【题目链接】
【题目大意】
题目已经讲得很清楚了
防剧透
防剧透
防剧透
防剧透
防剧透
防剧透
防剧透
防剧透
防剧透
【解题思路】
首先可以发现一个性质:路径的转折点只能在矩形的顶点上。这个可以用任意三角形内一点到两顶点的距离<另一点到这两顶点的距离来证明。
于是这个明显是有阶段性的,也即只能从左到右。于是可以Dp,当然也可以spfa或Dijkstra等等。
算法关键在于如何求出任意两点间的距离。
朴素做法要O(n^3),这明显是过不了的。
我们考虑从每个点开始走,发现每次阻挡视野的都是刚刚走过的矩形的边。于是我们可以维护一个视野,用每个访问过的点更新视野的up or low。
Postscript:记得加上等号……
#include <cstdio>
#include <algorithm>
#include <cmath>
typedef long long ll;
const int N = 2000 + 9;
struct Point
{
int x,y;
Point(const int _x = 0,const int _y = 0):
x(_x),y(_y){}
}p[N * 4],S,T;
int n,pre[N],start;
double dis[N*4],v;
inline ll sqr(const int x){return 1ll*x*x;}
inline double Dis(const Point x,const Point y)
{return std::sqrt(sqr(y.x-x.x) + sqr(y.y-x.y));}
inline ll cpr(const Point x,const Point y,const Point z)
{
const ll x1 = y.x - x.x, y1 = y.y - x.y;
const ll x2 = z.x - x.x, y2 = z.y - x.y;
return x1*y2 - x2*y1;
}
bool check(const int up,const int low,const Point x,const Point y)
{
if (up && cpr(x,p[up],y) > 0 || low && cpr(x,p[low],y) < 0) return false;
return true;
}
double Dijkstra()
{
static bool ins[N*4];
for (start = 1; start <= n; ++start)
if (p[start].x >= S.x) break;
for (int i = start--; i <= n; ++i) dis[i] = 99999999.0;
dis[start] = 0; p[start] = S; dis[4*N - 1] = 999999999.0; pre[start] = -1;
while (1) {
int k = 4*N - 1;
for (int i = start; i <= n; ++i)
if (!ins[i] && dis[k] > dis[i]) k = i;
if (n == k) return dis[k];
ins[k] = 1;
if (k == 7)
k = 7;
int up = 0,low = 0; double tmp;
for (int i = k + 1; i <= n; ++i) {
if (check(up,low,p[k],p[i]))
if (!ins[i] && dis[i] > (tmp = dis[k] + Dis(p[k],p[i])))
dis[i] = tmp;
if (((i-1)%4+1)&1 && (!up || cpr(p[k],p[up],p[i]) <= 0)) up = i;
else if (!(((i-1)%4+1)&1) && (!low || cpr(p[k],p[low],p[i]) >= 0)) low = i;
if (up && low && cpr(p[k],p[up],p[low]) > 0) break;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("2433.in","r",stdin);
freopen("2433.out","w",stdout);
#endif
scanf("%d",&n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d%d",&p[i*4-2].x,&p[i*4-2].y,&p[i*4-1].x,&p[i*4-1].y);
p[i*4-3] = Point(p[i*4-2].x,p[i*4-1].y);
p[i*4] = Point(p[i*4-1].x,p[i*4-2].y);
}
scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
n *= 4;
if (S.x > T.x) std::swap(S,T);
for (; n; --n)
if (p[n].x <= T.x) break;
p[++n] = T;
scanf("%lf",&v);
printf("%.10f\n",Dijkstra()/v);
}
[bzoj2433][Noi2011]智能车比赛的更多相关文章
- 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) ...
- [NOI2011]智能车比赛 (计算几何 DAG)
/* 可以发现, 最优路径上的所有拐点, 基本上都满足一定的性质, 也就是说是在矩形上的拐角处 所以我们可以把他们提出来, 单独判断即可 由于我们提出来的不超过2n + 2个点, 我们将其按照x坐标排 ...
- 【[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& ...
随机推荐
- gdoi2017
今年的gdoi第一天t1大水题一道 裸的kmp 但是 我把记录长度的int数组开成了char类型 正解变爆零 心态爆炸......... 后面的第二题两千字题目以及五千字附加故事(我是没有去看,据说全 ...
- ASP.NET AjaxControlToolkit-Framework4.0 配置实用(简单介绍CalendarExtender日期控件)
1:下载:AjaxControlToolkit Ajax Control Toolkit .NET 4 Ajax Control Toolkit .NET 4.5 Ajax Control Toolk ...
- flask_返回字节流错误
# flask_返回字节流错误 def export_data(filename, fields, data, names=None, sheet='Sheet1'): # fields 为list ...
- Keil MDK 5.14 仿真时System Viewer菜单显示空白和Peripherals菜单无外设寄存器
keil mdk5.14新建工程进行仿真时,进入Debug环境发现System Viewer菜单显示空白,Peripherals菜单没有外设寄存器.如图1和图2所示.打开Oprons for Targ ...
- DTW 算法(转)
DTW为(Dynamic Time Warping,动态时间归准)的简称.应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中.可能大家学过这些类似的课程都看到 ...
- Linux System.map文件【转】
转自:http://blog.csdn.net/ysbj123/article/details/51233618 当运行GNU链接器gld(ld)时若使用了"-M"选项,或者使用n ...
- monkey测试===Monkey测试策略(系列二)转
Monkey的测试策略 一. 分类 Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一a ...
- (十五)linux下gdb调试
一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...
- Jmeter性能测试示例
这次成功做了一个jmeter借口性能测试的简单测试示例,分享一下给大家. jmeter作为一个简单的开源工具,基于java的性能测试工具,使用起来很简单. 也可以作为二次开发,复杂的情形可以自己写代码 ...
- Matcher匹配器查找字符串指定内容
public static void main(String[] args) { String s = "我的手机号码是18988888888,曾经用过18987654321,还用过1881 ...