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. Linux字符设备驱动解析

    1.驱动即是一个内核模块,需要模块初始化函数 module_init() module_exit() 2.分配cdev struct cdev dev; 3.初始化cdev并定义file_operat ...

  2. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  3. JLOI2016 方

    bzoj4558 真是一道非常excited的题目啊-JLOI有毒 题目大意:给一个(N+1)*(M+1)的网格图,格点坐标为(0~N,0~M),现在挖去了K个点,求剩下多少个正方形(需要注意的是正方 ...

  4. 让树莓派开机发送自己的ip到邮箱

    一.代码如下: sendIpMail.py #-*-coding=utf-8-*- import socket import fcntl import struct from email import ...

  5. 多线程进行http请求

    昨天需要一个线下脚本进行单播推送,大约有1kw个用户,考虑到推送速度就临时搞了个请求线上的一个脚本 /** * 临时支持invoke单播推送 */ #include <stdio.h> # ...

  6. CGI、FastCGI和PHP-FPM关系图解

    CGI.FastCGI和PHP-FPM关系图解   webapp即是php解析器等 当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器.接下 ...

  7. QT TCP文件上传服务器

    利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...

  8. C#命名空间的嵌套

    namespace abc.e.f//等价于下面分层嵌套的写法.且这种写法不管命名空间abc有没有定义过,也不管命名空间e有没有定义过 { class ctest { public void func ...

  9. 详解javascript 存储

    javascript用于存储的方式可谓是多种多样,善于应用‘存储’可以大大的提高网站的性能,博主结合日常开发常见需求做一下总结,希望对大家有用- 1.cookie 存储大小:   4kb左右,以20个 ...

  10. CSS实现透明边框

    border: 8px solid rgba(255,255,255,0.2);