POJ1984
题目链接:https://vjudge.net/problem/POJ-1984
解题思路:并查集+离线操作。
用dx[ ]和dy[ ]两个数组存储某点相对于该点所在集合的源头的方位,因此不难推知dx[ ]和dy[ ]要初始化为0。当把一个点依附到另一个点之上时所用的技巧值得细细体会。而finds( )函数则更是点睛之笔。
AC代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=+;
int fa[maxn],dx[maxn],dy[maxn];
struct input{
int F1,F2,L;
char D[];
}inode[maxn];
struct query{
int F1,F2,I,ind;
}qnode[];
bool cmp(const query &a,const query &b){
return a.I<b.I;
}
int finds(int temp){
if(fa[temp]==-)
return temp;
int tp=finds(fa[temp]);
dx[temp]+=dx[fa[temp]];
dy[temp]+=dy[fa[temp]];
return fa[temp]=tp;
}
int ans[];
int main(){
memset(fa,-,sizeof(fa));
memset(dx,,sizeof(dx));
memset(dy,,sizeof(dy));
int N,M,K;
scanf("%d%d",&N,&M);
for(int i=;i<M;i++)
scanf("%d%d%d%s",&inode[i].F1,&inode[i].F2,&inode[i].L,inode[i].D);
scanf("%d",&K);
for(int i=;i<K;i++){
scanf("%d%d%d",&qnode[i].F1,&qnode[i].F2,&qnode[i].I);
qnode[i].ind=i;
}
sort(qnode,qnode+K,cmp); int j=;
for(int i=;i<M;i++){
int t1=finds(inode[i].F1),t2=finds(inode[i].F2);
if(t1!=t2){
fa[t2]=t1;
if(inode[i].D[]=='N'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2];
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2]+inode[i].L;
}
else if(inode[i].D[]=='E'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2]+inode[i].L;
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2];
}
else if(inode[i].D[]=='W'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2]-inode[i].L;
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2];
}
else if(inode[i].D[]=='S'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2];
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2]-inode[i].L;
}
}
while(i==qnode[j].I-){
int tt1=finds(qnode[j].F1),tt2=finds(qnode[j].F2);
if(tt1!=tt2) ans[qnode[j].ind]=-;
else
ans[qnode[j].ind]=abs(dx[qnode[j].F1]-dx[qnode[j].F2])+abs(dy[qnode[j].F1]-dy[qnode[j].F2]);
j++;
}
}
for(int i=;i<K;i++) printf("%d\n",ans[i]);
return ;
}
POJ1984的更多相关文章
- 【poj1984】 Navigation Nightmare
http://poj.org/problem?id=1984 (题目链接) 题意 给出一棵树,这棵树是以平面直角坐标系为基准建立的,也就是每个节点最多只有上下左右4条边.现在动态建树,同时询问两点间的 ...
- 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)
并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构, 可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...
- [POJ1984]Navigation Nightmare
[POJ1984]Navigation Nightmare 试题描述 Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- poj1984 带权并查集
题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...
- poj1984(带权并查集)
题目链接:http://poj.org/problem?id=1984 题意:给定n个farm,m条边连接farm,k组询问,询问根据前t3条边求t1到t2的曼哈顿距离,若不可求则输出-1. 思路:类 ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- POJ1984 Navigation Nightmare —— 种类并查集
题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K T ...
- poj1984并查集的相对偏移
#include<stdio.h>//典型题 #include<math.h> #define N 40010 struct node { int x,y,z; }pre[N] ...
随机推荐
- 【Linux常见命令】tar命令
[独立命令,只能用其中一个,和别的命令连用]这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个. -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末 ...
- CF思维联系–CodeForces - 222 C Reducing Fractions(数学+有技巧的枚举)
ACM思维题训练集合 To confuse the opponents, the Galactic Empire represents fractions in an unusual format. ...
- django最全面的知识点,直接开发完整手机购物商城练手,
带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址: https://www.duans ...
- RocketMQ-架构篇
RocketMQ-架构篇 1.Broker Broker是RocketMQ的服务端组件之一,所有消息存储在Broker上,所有的投递.消费请求也都由Broker进行处理.Broker是有状态的应用,本 ...
- c/c++获取硬盘序列号
最近在接触软件注册模块,需要获取硬盘序列号来生成注册码. 硬盘序列号,英文名:Hard Disk Serial Number,该号是硬盘厂家为区别产品而设置的,是唯一的.网上搜索一下,发现获取硬盘序列 ...
- 【Kafka】监控及运维——kafka-eagle
目录 简单介绍 概述 安装部署 一.环境要求 二.下载源码包并解压 三.准备数据库 四.修改配置文件 五.配置环境变量 六.启动kafka-eagle 七.成功运行 简单介绍 概述 Kafka-eag ...
- vue-cli3.0读取外部化配置文件来修改公共路径
之前我写过一篇通过nginx配置代理转发的博客,正常来说也是正确的,但不足之处在了甲方还用了F5负载均衡和gateway来代理转发.所以之前我认为的请求->nginx转发代理->后端服务, ...
- 数组的操作。1,JS数组去重。2,把数组中存在的某个值,全部找出来。3在JS数组指定位置插入元素。。。
1,数组去重 let arr = [1,2,3,4,5,6,1,2,3,'a','b','a']; let temp = []; // 作为存储新数组使用 for(let i = 0; i < ...
- 【poj 2406】Power Strings 后缀数组DC3模板 【连续重复子串】
Power Strings 题意 给出一个字符串s,求s最多由几个相同的字符串重复而成(最小循环节的重复次数) 思路 之前学习KMP的时候做过. 我的思路是:枚举字符串的长度,对于当前长度k,判断\( ...
- [hdu5312]数的拆分,数学推导
题意:给定一个序列,a[n]=3n(n-1)+1,n>=1,求给定的m(m<=1e9)最少可以用几个a里面的数表示(可以重复) 思路:对答案分类 (1)假定答案为1,则m必定是a中的某一个 ...