[POJ1984]Navigation Nightmare
[POJ1984]Navigation Nightmare
试题描述
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".
输入
* 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.
输出
* 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.
输入示例
E
E
S
N
W
S
输出示例
-
数据规模及约定
见“试题描述”
题解
带权并查集,把每个关系中的位移转换成向量,然后这些向量是可以叠加的,于是就像子树权值加那样打一下懒标记搞一搞就好了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} struct Vector {
int x, y;
Vector() {}
Vector(int _, int __): x(_), y(__) {}
Vector operator + (const Vector& t) const { return Vector(x + t.x, y + t.y); }
Vector operator += (const Vector& t) { *this = *this + t; return *this; }
Vector operator - (const Vector& t) const { return Vector(x - t.x, y - t.y); }
int dis() const { return abs(x) + abs(y); }
}; #define maxn 40010
#define maxq 10010 struct Que {
int u, v, k, id;
Que() {}
Que(int _1, int _2, int _3, int _4): u(_1), v(_2), k(_3), id(_4) {}
bool operator < (const Que& t) const { return k < t.k; }
} qs[maxq];
int ans[maxq]; struct Edge {
int f1, f2;
Vector Mov;
Edge() {}
Edge(int _1, int _2, Vector _3): f1(_1), f2(_2), Mov(_3) {}
} es[maxn]; int fa[maxn];
Vector tag[maxn];
int findset(int x) {
if(x == fa[x]) return x;
int t = findset(fa[x]);
tag[x] += tag[fa[x]];
return fa[x] = t;
} int main() {
int n = read(), m = read();
for(int i = 1; i <= m; i++) {
int u = read(), v = read(), l = read();
char dir[2];
scanf("%s", dir);
Vector Mov;
if(dir[0] == 'N') Mov = Vector(-l, 0);
if(dir[0] == 'S') Mov = Vector(l, 0);
if(dir[0] == 'W') Mov = Vector(0, -l);
if(dir[0] == 'E') Mov = Vector(0, l);
es[i] = Edge(u, v, Mov);
} int q = read();
for(int i = 1; i <= q; i++) {
int u = read(), v = read(), k = read();
qs[i] = Que(u, v, k, i);
}
sort(qs + 1, qs + q + 1); for(int i = 1; i <= n; i++) fa[i] = i, tag[i] = Vector(0, 0);
for(int i = 1, j = 1; i <= q; i++) {
while(j <= m && j <= qs[i].k) {
int u = findset(es[j].f1), v = findset(es[j].f2);
if(u != v) {
tag[v] = tag[es[j].f1] + es[j].Mov - tag[es[j].f2];
fa[v] = u;
}
j++;
}
int u = findset(qs[i].u), v = findset(qs[i].v);
if(u != v) ans[qs[i].id] = -1;
else ans[qs[i].id] = (tag[qs[i].u] - tag[qs[i].v]).dis();
} for(int i = 1; i <= q; i++) printf("%d\n", ans[i]); return 0;
}
[POJ1984]Navigation Nightmare的更多相关文章
- POJ1984 Navigation Nightmare —— 种类并查集
题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K T ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- POJ 1984 Navigation Nightmare 带全并查集
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- 【POJ 1984】Navigation Nightmare(带权并查集)
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...
- POJ 1984 Navigation Nightmare (数据结构-并检查集合)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4072 Accepted: 1 ...
- BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集
BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...
- POJ 1984 Navigation Nightmare 【经典带权并查集】
任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K To ...
- 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
[bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...
- Navigation Nightmare POJ - 1984
Navigation Nightmare Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usual ...
随机推荐
- STM32HAL库学习之前言
HAL库:HAL 的全称是: Hardware Abstraction Layer (硬件抽象层) ,是ST最新推荐的库.包括基本库和扩展库(功能外展):三种编程模型(轮询.中断和 DMA) 灵活的回 ...
- SOLR-disMax查询参数
dismax参数用于处理用户输入的简单短语,并根据字段的重要度进行加权查询,查询范围为多个字段区域.dismax会忽略搜索字符串中的 "AND","OR", & ...
- RPC之远程过程调用
一. 简介 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 1. 类比: 将计算机服 ...
- JS进阶-特殊形式的函数-内部私有函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flex和box兼容性写法
display: -webkit-box; /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */ display: -moz-box; /* Firefox 17- ...
- Bundle的用法
一.API文档说明 1.介绍 用于不同Activity之间的数据传递 1.重要方法 clear():清除此Bundle映射中的所有保存的数据. clone():克隆当前Bundle containsK ...
- 6 Specialzed layers 特殊层 第二部分 读书笔记
CAGradientLayer CAGradientLayer is used to generate a smooth gradient between two or more colors. ...
- 实战角度比较EJB2和EJB3的架构异同
] EJB编程模型的简化 首先,EJB3简化的一个主要表现是:在EJB3中,一个EJB不再象EJB2中需要两个接口一个Bean实现类,虽然我们以前使用JBuilder这样可视化开发工具自动生成了EJB ...
- 洛谷 P2515 [HAOI2010]软件安装
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- (转)使用Spring的注解方式实现AOP的细节
http://blog.csdn.net/yerenyuan_pku/article/details/52879669 前面我们已经入门使用Spring的注解方式实现AOP了,现在我们再来学习使用Sp ...