Problem Description

平面上有 n 个矩形,矩形的边平行于坐标轴,现在度度熊需要操控一名角色从 A 点走到 B点。 
该角色可以上下左右移动,在恰被 k 个矩形覆盖的区域,该角色的速率为 k+1 个距离/秒(矩形覆盖区域包括边界)。

请求出 A 移动到 B 最快需要多少秒。

Input

第一行一个整数 T (1≤T≤5) 表示数据组数。 
对于每组数据,第一行输入一个整数 n (1≤n≤200)。 
接下来 n 行每行 4 个整数 x1,y1,x2,y2 (0≤x1<x2≤1000000000,0≤y1<y2≤1000000000),分别表示矩形的左下角和右上角的坐标。 
最后一行四个整数 xa,ya,xb,yb ((0≤xa,xb,ya,yb≤1000000000) 代表 A 和 B 的坐标。

Output

出 T 行,每行一个整数表示答案。对于每组数据,输出一个小数表示答案。答案保留 5 位小数。

Sample Input

1
1
5 5 6 6
7 7 8 8

Sample Output

2.00000

思路:

题中给出的 x、y 的范围可到 1000000000,但矩形个数 n 最多直到 200,因此可以用区间离散化的思想,将所有的 x、y 的坐标保存后离散化,建立网格图,这样一来,最多只有 400*400=160000 个点,相邻两点的边就是两点之间的距离/速度

然后开两个数组,分别统计每个点在水平和垂直方向上被多少个矩形覆盖,对于每一个矩形,将每一条边被矩形覆盖的次数赋给其临近的点,这样将矩形内部的速度转为两点之间的速度,最后跑最短路即可

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
const int MOD = 1E9+7;
const int N = 400+5;
const int dx[] = {1,-1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;double dis[N][N];
bool vis[N][N];
struct Node{int x,y;bool operator < (const Node &rhs) const{return dis[x][y]>=dis[rhs.x][rhs.y];}
}node[N],st,ed;
int G[N][5];
int x[N],y[N],totX,totY;
int numY[N][N],numX[N][N];//水平与垂直方向每个顶点被矩形覆盖的距离
void bfs(int lenX,int lenY){for(int i=1;i<=lenX;i++){for(int j=1;j<=lenY;j++){dis[i][j]=INF;vis[i][j]=false;}}dis[st.x][st.y]=0;priority_queue<Node,vector<Node>,less<Node> >Q;Q.push(st);while(!Q.empty()){Node now=Q.top();Q.pop();int nowX=now.x;int nowY=now.y;if(vis[nowX][nowY])continue;vis[nowX][nowY]=true;for(int i=0;i<4;i++){int nx=nowX+dx[i];int ny=nowY+dy[i];if(nx>totX||ny>totY||!nx||!ny||vis[nx][ny])continue;double temp;if(nowX==nx)//垂直方向temp = abs(y[nowY]-y[ny])*1.0 / numY[nowX][min(nowY,ny)];else//水平方向temp = abs(x[nowX]-x[nx])*1.0 / numX[min(nowX,nx)][nowY];if(dis[nowX][nowY]+temp<dis[nx][ny]){dis[nx][ny]=dis[nowX][nowY]+temp;now.x=nx;now.y=ny;Q.push(now);}}}
}
int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);totX=0,totY=0;for(int i=1;i<=n;i++){for(int j=1;j<=4;j++)scanf("%d",&G[i][j]);x[++totX]=G[i][1];y[++totY]=G[i][2];x[++totX]=G[i][3];y[++totY]=G[i][4];}scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);x[++totX]=st.x;y[++totY]=st.y;x[++totX]=ed.x;y[++totY]=ed.y;//离散化sort(x+1,x+1+totX);sort(y+1,y+1+totY);int lenX=unique(x+1,x+1+totX)-x-1;int lenY=unique(y+1,y+1+totY)-y-1;for(int i=1;i<=n;i++){G[i][1]=lower_bound(x+1,x+1+lenX,G[i][1])-x;G[i][2]=lower_bound(y+1,y+1+lenY,G[i][2])-y;G[i][3]=lower_bound(x+1,x+1+lenX,G[i][3])-x;G[i][4]=lower_bound(y+1,y+1+lenY,G[i][4])-y;}st.x=lower_bound(x+1,x+1+lenX,st.x)-x;st.y=lower_bound(y+1,y+1+lenY,st.y)-y;ed.x=lower_bound(x+1,x+1+lenX,ed.x)-x;ed.y=lower_bound(y+1,y+1+lenY,ed.y)-y;//统计每个点被矩形覆盖次数for(int i=1;i<=lenX;i++)for(int j=1;j<=lenY;j++)numX[i][j]=numY[i][j]=1;for(int i=1;i<=n;i++){//水平方向for(int j=G[i][1];j<G[i][3];j++)//最右端不记录for(int k=G[i][2];k<=G[i][4];k++)numX[j][k]++;//垂直方向for(int j=G[i][1];j<=G[i][3];j++)for(int k=G[i][2];k<G[i][4];k++)//最右端不记录numY[j][k]++;}bfs(lenX,lenY);printf("%.5lf\n",dis[ed.x][ed.y]);}return 0;
}

Mindis(HDU-6670)相关推荐

  1. 有源汇有上下界最大流/最小流 配题(HDU 3157)

    因为是有源汇所以设源点为 s,汇点为 t. 有源汇有上下界最大流: 连接一条 t 指向 s 的边,容量为 INF. 通过上述步骤,现在图变成了无源汇网络. 引入超级源点 S,超级汇点 T. 连接一条 ...

  2. 最大表示法--环形字符串最大字典序(HDU 5442)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 问题概述:n个字符围成一个环,请从这个环中找出字典序最大的长度为n的字符串,输出它的起始点和方向(0顺1 ...

  3. HDU2019多校第二场 1009(HDU 6599) I Love Palindrome String(回文树(自动机)+manacher)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 解题思路: 回文自动机求每个本质不同的子串出现的次数,同时记录每个节点i代表的回文串第一次出现的 ...

  4. S-Nim (HDU 1536)组合博弈SG多组游戏

    S-Nim 题目链接 Problem Description Arthur and his sister Caroll have been playing a game called Nim for ...

  5. BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5154 题目意思:有 n 门 processes(编号依次为1,2,...,n),然后给出 m 种关系: ...

  6. (HDU - 1847)Good Luck in CET-4 Everybody!(博弈)

    题目链接:Good Luck in CET-4 Everybody! - HDU 1847 - Virtual Judge (ppsucxtt.cn) 题目是中文的,我在这就不翻译题意了. 先说一种打 ...

  7. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  8. 单词数(HDU 2072)

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就 ...

  9. Ant Trip(HDU 3018)---多笔画问题

    题目链接 题目描述 Ant Country consist of N towns.There are M roads connecting the towns. Ant Tony,together w ...

  10. 机器人的舞蹈(hdu 2232)

    机器人的舞蹈 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. 计算机画图工具怎么缩小图片,Win10如何放大或缩小图片?利用win10画图工具放大、缩小图片教程...
  2. Python培训就业怎么样?
  3. axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理
  4. 【Vue】 vue-Router children 子组件空白显示,没有内容
  5. java compareandset 包_Java AtomicReferenceArray compareAndSet()用法及代码示例
  6. python ssh 远程登录路由器执行命令_ssh批量登录并执行命令(python实现)
  7. 程序员分析报告(2018)-总结篇
  8. 教你如何一篇博客读懂设计模式之—--原型模式
  9. 可燃气体浓度多少合格_科普:气体容积单位LEL%、VOL%、TLV(ppm)之间如何换算?...
  10. Webmin是目前功能最强大的基于Web的Unix系统管理工具
  11. 硬盘与电线挨着会高温吗_对着电线撒尿,会触电吗?
  12. C++之move提升copy性能
  13. 智能优化算法:算术优化算法-附代码
  14. 分享一个圆角自定义的漂亮AlertDialog
  15. java泛型类型擦除
  16. 成功解决gyp verb ensuring that file exists: C:\Python27\python.exe gyp ERR! configure error gyp ERR! sta
  17. Web入门-namp的下载与使用
  18. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)
  19. stateflow之学习——01
  20. Safe Browsing

热门文章

  1. 删除vs的调试其他软件的功能
  2. 送给爱读书的孩子:2019年最受欢迎的30个书单
  3. “让数据用起来”:解读数据中台必备的4个核心能力
  4. STM32之ADC多通道连续例程
  5. python上传文件 request_Python request post上传文件常见要点
  6. 简单的Postman,还能玩出花?
  7. jeecg 分布式部署附件共享问题(Linux软连接和硬链接)
  8. java批量执行多条Sql语句
  9. oracle简单对象类型
  10. shell脚本的简单学习