Problem - D - Codeforces

Yura已经走了一段时间了,正打算回家。他得尽快回家。为了做到这一点,Yura可以使用城市周围的即时移动位置。我们把城市表示成n × n个街区的面积。Yura需要从坐标(S, Sy)的块移动到坐标(fa, fy)的块。在一分钟内,Yura可以移动到任何相邻的侧块;换句话说,他可以向四个方向移动。此外,在城市中有m个即时移动地点。你和尤拉都知道他们的坐标。如果Yura位于与该位置具有相同坐标z或相同坐标y的块中,他可以立即移动到即时移动位置。帮助Yura找到回家所需的最短时间。

输入第一行包含两个整数n和m——城市的大小和瞬时移动位置的数量(1 < n <10°,0<m<105)。下一行包含四个整数S她嘘——Yura最初所处位置的坐标及他家的坐标(1<S, Syfafy<n).接下来的m行每一行包含两个整数xi yi -第i个瞬时移动位置的坐标(1 < xi, yi ns)。输出在唯一一行打印出回家所需的最短时间。

Examples

input

Copy

5 3
1 1 5 5
1 2
4 1
3 3

output

Copy

5

input

Copy

84 5
67 59 41 2
39 56
7 2
15 3
74 18
22 7

output

Copy

42

请注意在第一个例子中,Yura需要从(1,1)到达(5,5)。他可以在5分钟内先使用第二个即时移动位置(因为它的y坐标等于Yura的y坐标),然后步行(4,1)→(4,2)→(4,3)→(5,3)→(5,4)→(5,5)。

题解:
果然图论建图才是最难的,

对于每个瞬移点,起点到其距离应该是min(abs(sx - x),abs(sy - y)),

瞬移点到终点的距离是abs(ex - x) + abs(ey - y)

这点很容易写出来

关键是瞬移点与瞬移点的距离不好建图

暴力m*m肯定会t

通过观察我们发现,先对x坐标从大到小排序

 

如果是这种, A - C的最短距离肯定是A - B的最短 +  B - C的最短

 

但是如果是这种情况就不成立了

所以也要对y进行一次排序,相邻建图

还有一点就是跑堆优化最短路时,这里有符号整数溢出

 wa40

改成这样就AC了

 不太清楚为什么,以后尽量用第二种吧

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define int long long
vector<PII> p[200050];
int n,m;
int sx,sy,ex,ey;
struct node
{int x,y,id;
}a[200050];
int dis[200050];
int cmpx(node a,node b)
{return a.x < b.x;
}
int cmpy(node a,node b)
{return a.y < b.y;
}
void solve()
{cin >> n >> m;cin >> a[m + 1].x >> a[m + 1].y >> a[m + 2].x >> a[m + 2].y;dis[m + 1] = dis[m + 2] = 2e18;for(int i = 1;i <= m;i++){dis[i] = 2e18;cin >> a[i].x >> a[i].y;a[i].id = i;p[m + 1].push_back({min(abs(a[m + 1].x - a[i].x),abs(a[m + 1].y - a[i].y)),i});p[i].push_back({min(abs(a[m + 1].x - a[i].x),abs(a[m + 1].y - a[i].y)),m + 1}); p[i].push_back({abs(a[m + 2].x - a[i].x) + abs(a[m + 2].y - a[i].y),m + 2});p[m + 2].push_back({abs(a[m + 2].x - a[i].x) + abs(a[m + 2].y - a[i].y),i});}sort(a + 1,a + 1 +m,cmpx);for(int i = 2;i <= m;i++){int u = a[i - 1].id;int v = a[i].id;int w = min(abs(a[i - 1].x - a[i].x),abs(a[i - 1].y - a[i].y));p[u].push_back({w,v});p[v].push_back({w,u});}sort(a + 1,a + 1 +m,cmpy);for(int i = 2;i <= m;i++){int u = a[i - 1].id;int v = a[i].id;int w = min(abs(a[i - 1].x - a[i].x),abs(a[i - 1].y - a[i].y));p[u].push_back({w,v});p[v].push_back({w,u});} priority_queue<PII,vector<PII>,greater<PII>>q;dis[m + 1] = 0;q.push({0, m + 1});while(q.size()){PII t = q.top();q.pop();for(PII ne:p[t.second]){if(dis[ne.second] > dis[t.second] + ne.first){dis[ne.second] = dis[t.second] + ne.first;q.push({dis[ne.second],ne.second});}}}cout << min(dis[m + 2],abs(a[m + 1].x - a[m + 2].x) + abs(a[m + 2].y - a[m + 1].y));
}signed main()
{
//  ios::sync_with_stdio(0);
//  cin.tie(0);cout.tie(0);int t = 1;
//  cin >> t;while(t--){solve(); }
}

D. Returning Home(建图 + 堆优化最短路)相关推荐

  1. 拆位+堆优化最短路 牛妹游历城市 牛客练习赛67

    对于一道题目,如果涉及到了位运算,二进制,那么优先考虑二进制,观察其性质 本题以对点权的二进制构造边,构造32个虚点,从而建立出图 堆优化优先队列,一定不要出现爆LL的情况,这样极有可能MLE,TLE ...

  2. Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)

    Description 小白非常喜欢玩 "县际争霸" 这款游戏,虽然他的技术并不容乐观."县际争霸" 的地图共有两个县,每个县里各有 n n n 个据点.同一个 ...

  3. CF EDU138 D(数论) ,牛练104C(DP) ,焦作F. Honeycomb(复杂建图,BFS最短路)

    一个感觉还不错的题 D. Counting Arrays 题意:当我们有一个数组,我们可以移除其和满足gcd(a[i],i)=1的元素(移除后自动补位).现在我们有一个数组b,b的每个元素规定了当前我 ...

  4. LeetCode 1334. 阈值距离内邻居最少的城市--堆优化最短路

    阈值距离内邻居最少的城市 有 n 个城市,按从 0 到 n-1 编号.给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi ...

  5. 【牛客NOIP模拟】路径难题【建图】【最短路证明】

    题意:一张 nnn 个点 mmm 条边的无向图,边带距离,可以坐出租车,花费为距离除以常数 rrr 向上取整:也可以坐公交车,每路车行驶路线给定,无论坐多少站花费都为 cic_ici​ (每路车可能不 ...

  6. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  7. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  8. AcWing 4246. 最短路径和(反向建图+链式前向星+堆优化)

    题目连接 https://www.acwing.com/problem/content/description/4249/ http://poj.org/problem?id=1511 思路 其实这道 ...

  9. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

最新文章

  1. mysql7 zip windows_mysql 5.7 windows zip 版本安装配置
  2. 同步、异步、阻塞、非阻塞
  3. xss 跨站脚本漏洞 php,跨站脚本漏洞(XSS)基础讲解
  4. 浏览器渲染流水线解析
  5. HashMap中put方法的过程
  6. 浙大版《C语言程序设计(第3版)》题目集 练习3-3 统计学生平均成绩与及格人数 (15 分)...
  7. 两个简单多边形面积相等,那么其中一个能分割成有限多块多边形,经过平移和旋转,拼合成第二个多边形...
  8. 迭代器 java_百战程序员:Java设计模式之迭代器模式
  9. 周末项目:使用scikit-learn进行手语和静态手势识别
  10. perf script 执行时间_在Python中准确地测量代码执行时间
  11. 真的发现自己已不再年轻
  12. WebGrid 详解
  13. android 音效,音效  |  Android 开源项目  |  Android Open Source Project
  14. 分享一个特别喜欢的背景图片
  15. ChatGPT时代,推荐几个宝藏公众号!
  16. 关于html video 在chrome浏览器下无法快进问题解决
  17. 应用matplotlib的imshow函数显示彩色图像(RGB data)报错的解决方法
  18. java drawimage图片不完整_微信小程序canvas.drawImage完全显示图片问题的解决
  19. Witt向量简介 论文的参考文献
  20. HDU6112-今夕何夕

热门文章

  1. 对象存储 S3 在分布式文件系统中的应用
  2. 我是如何被逼出软件行业的(一)
  3. 橙色云助力烟台市工业企业转型升级 获2020年度烟台市瞪羚企业
  4. 大学计算机应用基础厦门大学pdf,厦门大学2016计算机应用基础复习题.pdf
  5. python格式化输出复数_格式化复数
  6. 以下不属于mysql列类型的是什么意思_下列 ________ 类型不是 MySQL 中常用的的数据类型。_学小易找答案...
  7. 【MyMooc学习平台部分剪影】
  8. ftp_mdtm() 函数
  9. 汽车诊断之UDS入门-0x27(SecurityAccess)安全访问
  10. 美国NCEP/NCAR再分析资料简介