Navigation Nightmare
Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 5939   Accepted: 2102
Case Time Limit: 1000MS

Description

Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000) vertical and horizontal roads each of varying lengths (1 <= length <= 1000) connect the farms. A map of these farms might look something like the illustration below in which farms are labeled F1..F7 for clarity and lengths between connected farms are shown as (n):

           F1 --- (13) ---- F6 --- (9) ----- F3

| |

(3) |

| (7)

F4 --- (20) -------- F2 |

| |

(2) F5

|

F7

Being an ASCII diagram, it is not precisely to scale, of course.

Each farm can connect directly to at most four other farms via roads that lead exactly north, south, east, and/or west. Moreover, farms are only located at the endpoints of roads, and some farm can be found at every endpoint of every road. No two roads cross, and precisely one path 
(sequence of roads) links every pair of farms.

FJ lost his paper copy of the farm map and he wants to reconstruct it from backup information on his computer. This data contains lines like the following, one for every road:

There is a road of length 10 running north from Farm #23 to Farm #17 
There is a road of length 7 running east from Farm #1 to Farm #17 
...

As FJ is retrieving this data, he is occasionally interrupted by questions such as the following that he receives from his navigationally-challenged neighbor, farmer Bob:

What is the Manhattan distance between farms #1 and #23?

FJ answers Bob, when he can (sometimes he doesn't yet have enough data yet). In the example above, the answer would be 17, since Bob wants to know the "Manhattan" distance between the pair of farms. 
The Manhattan distance between two points (x1,y1) and (x2,y2) is just |x1-x2| + |y1-y2| (which is the distance a taxicab in a large city must travel over city streets in a perfect grid to connect two x,y points).

When Bob asks about a particular pair of farms, FJ might not yet have enough information to deduce the distance between them; in this case, FJ apologizes profusely and replies with "-1".

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..M+1: Each line contains four space-separated entities, F1,

F2, L, and D that describe a road. F1 and F2 are numbers of

two farms connected by a road, L is its length, and D is a

character that is either 'N', 'E', 'S', or 'W' giving the

direction of the road from F1 to F2. * Line M+2: A single integer, K (1 <= K <= 10,000), the number of FB's

queries * Lines M+3..M+K+2: Each line corresponds to a query from Farmer Bob

and contains three space-separated integers: F1, F2, and I. F1

and F2 are numbers of the two farms in the query and I is the

index (1 <= I <= M) in the data after which Bob asks the

query. Data index 1 is on line 2 of the input data, and so on.

Output

* Lines 1..K: One integer per line, the response to each of Bob's

queries. Each line should contain either a distance

measurement or -1, if it is impossible to determine the

appropriate distance.

Sample Input

7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
3
1 6 1
1 4 3
2 6 6

Sample Output

13
-1
10

Hint

At time 1, FJ knows the distance between 1 and 6 is 13. 
At time 3, the distance between 1 and 4 is still unknown.

At the end, location 6 is 3 units west and 7 north of 2, so the distance is 10. 
 
题意:
有n个地点,m条边,对于每条边,有信息x,y,len,d,其中len表示x,y间的长度,d表示y相对于x的位置。现在有q个查询,每个查询有x,y,I,其中I表示完成I条路的时候当前2个点的状态。
 
思路:
首先很容易想到这事一题带权并查集的题目,因为各个点之间都有关系。但是关键在于如何处理这里的位置。现在我们用rel[x][0]表示x点到其所在树的父亲节点的向量的横坐标,rel[x][1]表示x点到其所在树的父亲节点的向量的纵坐标 ,其余的操作就是普通的带权并查集了。不过要注意一下这里的更新的操作(因为是向量)和每条边x,y的关系(更新时候谁当父节点)。
 
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<time.h>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1000000001
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN = ;
struct node
{
int x;
int y;
int z;
int id;
char s[];
ll ans;
}q[],a[MAXN];
int pa[MAXN],n,m,k,siz[MAXN];
ll rel[MAXN][];
void Init()
{
for(int i = ; i <= n; i++){
pa[i] = i;
siz[i] = ;
}
memset(rel,,sizeof(rel));
}
bool cmp1(node fa,node fb)
{
return fa.z < fb.z;
}
bool cmp2(node fa,node fb)
{
return fa.id < fb.id;
}
void getp(int& x,int& y,node fp,int flag)
{
if(fp.s[] == 'E'){
x = fp.z;
y = ;
}
else if(fp.s[] == 'W'){
x = - fp.z;
y = ;
}
else if(fp.s[] == 'S'){
x = ;
y = fp.z;
}
else {
x = ;
y = - fp.z;
}
if(flag)x *= -, y *= -;
}
int find(int x)
{
if(x != pa[x]){
int fx = find(pa[x]);
siz[fx] += siz[x];
rel[x][] = rel[x][] + rel[pa[x]][];
rel[x][] = rel[x][] + rel[pa[x]][];
pa[x] = fx;
}
return pa[x];
}
int main()
{
while(~scanf("%d%d",&n,&m)){
Init();
for(int i = ; i < m; i++){
scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].z,a[i].s);
}
scanf("%d",&k);
for(int i = ; i < k; i++){
q[i].id = i;
scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
}
sort(q,q+k,cmp1);
int p = ;
for(int i = ; i < m; i++){
int x = a[i].x;
int y = a[i].y;
int tx = ,ty = ;
int fx = find(x);
int fy = find(y);
if(fx != fy){
if(siz[fx] > ){
getp(tx,ty,a[i],);
siz[fx] += siz[fy];
pa[fy] = fx;
rel[fy][] = -rel[y][] - tx + rel[x][];
rel[fy][] = -rel[y][] - ty + rel[x][];
}
else {
getp(tx,ty,a[i],);
siz[fy] += siz[fx];
pa[fx] = fy;
rel[fx][] = rel[y][] - tx - rel[x][];
rel[fx][] = rel[y][] - ty - rel[x][];
}
}
while(p < k && q[p].z == i + ){
x = q[p].x;
y = q[p].y;
fx = find(x);
fy = find(y);
if(fx != fy){
q[p].ans = -;
}
else {
// cout<<rel[x][0]<<' '<<rel[y][0]<<' '<<rel[x][1]<<' '<<rel[y][1]<<endl;
q[p].ans = fabs(rel[x][] - rel[y][]) + fabs(rel[x][] - rel[y][]);
}
p ++;
}
}
sort(q,q+k,cmp2);
for(int i = ; i < k; i++){
printf("%lld\n",q[i].ans);
}
}
return ;
}

poj1984 带权并查集(向量处理)的更多相关文章

  1. poj1984 带权并查集

    题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...

  2. POJ 1182 食物链 (带权并查集 && 向量偏移)

    题意 : 中文题就不说题意了…… 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目 ...

  3. POJ 2492 A Bug's Life (带权并查集 && 向量偏移)

    题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配 ...

  4. POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)

    传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  5. 带权并查集 - How Many Answers Are Wrong

    思路: 带权并查集+向量偏移 #include <iostream> using namespace std; int n, m; ]; ]; // 到根节点的距离 ; void init ...

  6. POJ1984:Navigation Nightmare(带权并查集)

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

  7. HDU 1829 A Bug's Life 【带权并查集/补集法/向量法】

    Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...

  8. Zjnu Stadium(hdu3047带权并查集)

    题意:一个300列的无限行的循环场地,a b d代表a,b顺时针相距d的距离,现在给你一些距离,判断是否有冲突,如果有冲突计算冲突的次数 思路:带权并查集 a,b的距离等于b到根节点的距离 - a到根 ...

  9. poj 1733 Parity game(带权并查集+离散化)

    题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...

随机推荐

  1. Hibernate一对一关联映射配置

    一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...

  2. REST架构

    网络上的所有事物都被抽象为资源(resource): 每个资源对应一个唯一的资源标识符(resource identifier): 通过通用的连接器接口(generic connector inter ...

  3. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

  4. Jquery 数组操作

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  5. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

  6. Git开发备忘

    1.在Git中,上传了中文命名的文件,但是后面想删除的时候,发现中文命名被转义了. 利用Git add是无法添加这类文件的,所以这里我们需要用到 git add -u命令,即可实现成功添加. 2.在G ...

  7. win10下 解决系统进程占用80端口

    公司电脑从win7升级到win10,无法启动nginx,日志里输出:2016/05/30 09:26:01 [emerg] 7024#5440: bind() to 0.0.0.0:80 failed ...

  8. 关于code reiview

    先谈谈三个code review的关键因素: 一.创建review要简单 code reivew是一个程序员日常工作中经常做的一件事,理论上来讲,任何一个将要submit到SCM的change,都必须 ...

  9. 生成 PDF 全攻略【1】初体验

    经历过多少踩坑,翻看过多少类似博客,下载过多少版本的Jar,才能摸索出正确的代码书写方式,才能实现项目经理需求分析书中的功能点. 本文借一次 JavaEE 生成PDF的颠簸的实现过程,描述中小公司程序 ...

  10. PHP 基础笔记

    数据类型 字符串 整数 浮点数 布尔值 数组 对象 NULL 未定义的变量,数据类型为 NULL. PHP 中数组和对象是不同的类型,而 js 中数组即为对象.(ps: es6 已经内置了 class ...