【bzoj3362-导航难题】带权并查集
题意:
约翰所在的乡村可以看做一个二维平面,其中有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
代码:
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<cmath>
- #include<set>
- using namespace std;
- const int N=;
- int n,m,Q,f[N],g[N],fa[N],ans[N];
- struct node{
- char s[];
- int x,y,len;
- }a[N];
- struct nod{
- int t,x,y,id;
- }q[N];
- int myabs(int x){return x> ? x:-x;}
- bool cmp(nod x,nod y){return x.t<y.t;}
- int findfa(int x)
- {
- if(fa[x]!=x)
- {
- int y=fa[x];
- fa[x]=findfa(y);
- f[x]=f[x]+f[y];
- g[x]=g[x]+g[y];
- }
- return fa[x];
- }
- int main()
- {
- // freopen("a.in","r",stdin);
- freopen("navigate.in","r",stdin);
- freopen("navigate.out","w",stdout);
- scanf("%d%d",&n,&m);
- int x,y,len,xx,yy;
- for(int i=;i<=n;i++) fa[i]=i;
- memset(f,,sizeof(f));
- memset(g,,sizeof(g));
- for(int i=;i<=m;i++)
- {
- scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].len);
- scanf("%s",a[i].s);
- }
- scanf("%d",&Q);
- for(int i=;i<=Q;i++)
- {
- scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].t);
- q[i].id=i;
- }
- sort(q+,q++Q,cmp);
- int j=;
- for(int i=;i<=m;i++)
- {
- x=a[i].x,y=a[i].y,len=a[i].len;
- xx=findfa(x),yy=findfa(y);
- if(xx==yy) continue;
- fa[xx]=y;
- if(a[i].s[]=='E')
- {
- f[xx]=len-f[x];
- g[xx]=-g[x];
- }
- if(a[i].s[]=='W')
- {
- f[xx]=-len-f[x];
- g[xx]=-g[x];
- }
- if(a[i].s[]=='N')
- {
- f[xx]=-f[x];
- g[xx]=len-g[x];
- }
- if(a[i].s[]=='S')
- {
- f[xx]=-f[x];
- g[xx]=-len-g[x];
- }
- while(j<=Q && q[j].t==i)
- {
- x=q[j].x,y=q[j].y;
- xx=findfa(x),yy=findfa(y);
- if(xx!=yy) ans[q[j].id]=-;//printf("-1\n");
- 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]));
- j++;
- }
- }
- for(int i=;i<=Q;i++) printf("%d\n",ans[i]);
- return ;
- }
【bzoj3362-导航难题】带权并查集的更多相关文章
- 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
[bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...
- 失控的未来交通工具 (LOJ 508,带权并查集,数论)
LOJ 508 失控的未来交通工具 (带权并查集 + 数论) $ solution: $ 很综合的一道难题.看了让人不知所措,数据范围又大,题目描述又不清晰.只能说明这道题有很多性质,或者很多优化. ...
- 浅谈并查集&种类并查集&带权并查集
并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
随机推荐
- 团队作业week9 情景测试
一.使用人群:学生.计算机工作者.对计算机感兴趣的人 1.学生:学生是学霸系统的主要用户.学生一般会通过网络寻找与自己的课程,作业有关的信息.首先,可以通过我们的搜索功能在我们的数据库中寻找我们从网络 ...
- Ubuntu16.04修改IP
首先用root用户登陆,然后输入你root的密码.如下图: 然后编辑interfaces文件,该文件位于/etc/network/下,执行如下命令: vim /etc/network/interf ...
- JSP在页面加载时调用servlet的方法
方法:先在JS里面写一个调用servlet的事件(可以利用ajax),然后利用<body>标签的onload调用这个事件. 代码如下: jsp文件代码如下: <%@ page lan ...
- headers的描述
Cache-Control 作用: 这个是非常重要的规则. 这个用来指定Response-Request遵循的缓存机制.各个指令含义如下 Cache-Control:Public 可以被任何缓存所 ...
- 从1到n的阶乘的和(python)
今天在百度上逛一些ctf的平台,偶然发现一道编程题,于是乎,便用我刚刚学的python知识解了这道题 题目的描述是这样的: 计算1!+2!+3!+...+6666!后五位. 这个计算量很大啊,我还是用 ...
- IntelliJ IDEA Maven引入
- phpmyadmin中缺少mysqli扩展 的结解办法
修改 ;extension=php_mysqli.dll 去掉前面的 ; 以及 调整 php文件夹的目录位置. 这个办法是不是好使,我不确定.这个方法只适合 用win系统 这个,貌似 ...
- [剑指Offer] 63.数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. c ...
- MyBatis配置和日志
MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ...
- WPF一个对象显示多个属性
一个对象显示多个属性使用模板的方法: 如图: <dataTemplate x:key="MyDataTemplate">