题意:

约翰所在的乡村可以看做一个二维平面,其中有N 座牧场,每座牧场都有自己的坐标,编号为1
到N。牧场间存在一些道路,每条道路道路连接两个不同的牧场,方向必定平行于X 轴或Y轴。连通两座牧场之间的路径是唯一的。

突然间,约翰的导航仪失灵了,牧场的坐标记录全部消失了。所幸的是,约翰找到了表示道路的
数据,可以通过这些信息得知牧场间的相对位置。但贝西有急事,在约翰工作到一半的时候就要知道
一些牧场间的曼哈顿距离。这时,如果约翰能从找回的道路信息之间推算出答案,就会告诉贝西。请
你帮助约翰来回答贝西的问题吧。(x1,y1) 和(x2,y2) 间的曼哈顿距离定义为|x1 − x2| + |y1 − y2|。

– 如果字母是E、S、W 和N 中的一个,表示约翰找回了一条道路的信息,接下来有三个整
数x,y,和L,L 表示道路的长度,x,y表示道路连接的两个牧场,字母E、S、W、N
分别表示x在y的东、南、西、北方向。1 ≤x,y≤ N; 1 ≤ L ≤ 1000

1 ≤ N ≤ 40000; 1 ≤ Q ≤ 50000

题解:

对于每个点x,维护三个值:

fa[x]:x所在并查集的祖先,或者说是x的一个祖先。

f[x]:x到fa[x]的X坐标的差值,即X(x)-X(fa[x])

g[x]:x到fa[x]的Y坐标的差值,即Y(x)-Y(fa[x])

则并查集内任意亮点的x,y的曼哈顿距离为abs(f[x]-f[y])+abs(g[x]-g[y])

对于每条路径(x,y,len),我们可以把fa[x]连向y,则两个并查集合并。

设xx=fa[x],则fa[xx]=y。

f[xx]=X(xx)-X(y)=X(x)-X(y)-(X(x)-X(xx))=(+-)len-f[x]

g[xx]同理。

-1的情况:如果x和y不在同一个并查集内,则输出-1

代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. #include<set>
  9. using namespace std;
  10.  
  11. const int N=;
  12. int n,m,Q,f[N],g[N],fa[N],ans[N];
  13. struct node{
  14. char s[];
  15. int x,y,len;
  16. }a[N];
  17. struct nod{
  18. int t,x,y,id;
  19. }q[N];
  20. int myabs(int x){return x> ? x:-x;}
  21. bool cmp(nod x,nod y){return x.t<y.t;}
  22.  
  23. int findfa(int x)
  24. {
  25. if(fa[x]!=x)
  26. {
  27. int y=fa[x];
  28. fa[x]=findfa(y);
  29. f[x]=f[x]+f[y];
  30. g[x]=g[x]+g[y];
  31. }
  32. return fa[x];
  33. }
  34.  
  35. int main()
  36. {
  37. // freopen("a.in","r",stdin);
  38. freopen("navigate.in","r",stdin);
  39. freopen("navigate.out","w",stdout);
  40. scanf("%d%d",&n,&m);
  41. int x,y,len,xx,yy;
  42. for(int i=;i<=n;i++) fa[i]=i;
  43. memset(f,,sizeof(f));
  44. memset(g,,sizeof(g));
  45. for(int i=;i<=m;i++)
  46. {
  47. scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].len);
  48. scanf("%s",a[i].s);
  49. }
  50. scanf("%d",&Q);
  51. for(int i=;i<=Q;i++)
  52. {
  53. scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].t);
  54. q[i].id=i;
  55. }
  56. sort(q+,q++Q,cmp);
  57. int j=;
  58. for(int i=;i<=m;i++)
  59. {
  60. x=a[i].x,y=a[i].y,len=a[i].len;
  61. xx=findfa(x),yy=findfa(y);
  62. if(xx==yy) continue;
  63. fa[xx]=y;
  64. if(a[i].s[]=='E')
  65. {
  66. f[xx]=len-f[x];
  67. g[xx]=-g[x];
  68. }
  69. if(a[i].s[]=='W')
  70. {
  71. f[xx]=-len-f[x];
  72. g[xx]=-g[x];
  73. }
  74. if(a[i].s[]=='N')
  75. {
  76. f[xx]=-f[x];
  77. g[xx]=len-g[x];
  78. }
  79. if(a[i].s[]=='S')
  80. {
  81. f[xx]=-f[x];
  82. g[xx]=-len-g[x];
  83. }
  84. while(j<=Q && q[j].t==i)
  85. {
  86. x=q[j].x,y=q[j].y;
  87. xx=findfa(x),yy=findfa(y);
  88. if(xx!=yy) ans[q[j].id]=-;//printf("-1\n");
  89. else ans[q[j].id]=myabs(f[x]-f[y])+myabs(g[x]-g[y]);//printf("%d\n",myabs(f[x]-f[y])+myabs(g[x]-g[y]));
  90. j++;
  91. }
  92. }
  93. for(int i=;i<=Q;i++) printf("%d\n",ans[i]);
  94. return ;
  95. }

【bzoj3362-导航难题】带权并查集的更多相关文章

  1. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  2. 失控的未来交通工具 (LOJ 508,带权并查集,数论)

    LOJ 508 失控的未来交通工具 (带权并查集 + 数论) $ solution: $ 很综合的一道难题.看了让人不知所措,数据范围又大,题目描述又不清晰.只能说明这道题有很多性质,或者很多优化. ...

  3. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  4. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  5. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  6. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  7. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  8. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

  9. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

  10. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

随机推荐

  1. databales详解(一)

    学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...

  2. PART1 一些想法

    其实我一直是一个后知后觉的人,这点也是我过了好久才发现的问题,之所以晚发现自己这个毛病,是因为后知后觉==,这有点像是个悖论或者是笑话,但的确是真实存在于我的身上.其实当初为啥来这个学校选计算机的专业 ...

  3. 解决XAMPP中,MYSQL因修改my.ini后,无法启动的问题

    论这世上谁最娇贵,不是每年只开七天的睡火莲,也不是瑞典的维多利亚公主,更不是一到冬天就自动关机的iPhone 6s, 这世上最娇贵的,非XAMPP中的mysql莫属,记得儿时的我,年少轻狂,当时因为m ...

  4. try catch finally 与continue的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. using指令含义

    using指令作用: 就是导入命名空间,这样你比如用StringBuilder类,就不用System.Text.StringBuilder builder = new System.Text.Stri ...

  6. MyBatis原理系列

    原理分析之一:从JDBC到Mybatis 原理分析之二:框架整体设计 原理分析之三:初始化(配置文件读取和解析) 原理分析之四:一次SQL查询的源码分析

  7. Luogu4899 IOI2018狼人(kruskal重构树+主席树)

    可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集.于是建出重构树,就可以知道每个询问的连通情况了.现在要知 ...

  8. LOJ6388:[THUPC2018]赛艇——题解

    https://loj.ac/problem/6388 如果你做过BZOJ5217:[Lydsy2017省队十连测]航海舰队的话,那么恭喜你,这道题就是大水题. 如果你做过BZOJ4259:残缺的字符 ...

  9. Mac安装mysqldb

    一. 安装mysql (一)下载地址 https://pan.baidu.com/s/1slw50LZ 安装成功后,在系统偏好设置里有MySQL图标,可以启动或关闭MySQL 二. Mysql roo ...

  10. mysql 集群+主从同步

    SQL节点: 给上层应用层提供sql访问. 管理节点(MGM):  管理整个集群. 启动,关闭集群. 通过ndb_mgmd命令启动集群 存储/数据节点: 保存cluster中的数据.  数据节点,可以 ...