[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 ...
随机推荐
- nodejs+multiparty 文件上传
通过表单提交上传文件: html代码 <form action="/uploadFile" method="post" enctype=" ...
- match,location,history
哇,平常写路由时基本就是简单的按照组件给的示例写,从来没有考虑为什么,又遇见了路由相关的问题,先记录一下问题,好好捋一下,哎,好香要个大佬来带带我呀,每次遇到问题要解决好久 问题: 判断是否登录之后跳 ...
- JSP报错The value for the useBean class attribute *** is invalid.
环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...
- The lion king 经典句型摘录
What am I going to do with him? Everything the light touches is our kingdom. But I thought a king ca ...
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
昨天在项目中需要对日志的查询结果进行导出功能. 日志导出功能的实现是这样的,输入查询条件,然后对查询结果进行导出.由于日志数据量比较大.多的时候,有上亿条记录. 之前的解决方案都是多次查询,然后使用l ...
- codevs 2761 脏话过滤
时间限制: 1 s 空间限制: 8000 KB 题目等级 : 白银 Silver 题目描述 Description 某论坛希望打造文明论坛,对于每个帖子需要将脏话换成*输出. 脏话有38,25 ...
- TCP/IP详解之IP协议
1.IP协议 IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制 ...
- ML-学习提纲1
http://www.sohu.com/a/130379077_468714 本文用一系列「思维导图」由浅入深的总结了「统计学」领域的基础知识,是对之前系列文章做的一次完整的梳理,也是我至今为止所有与 ...
- ElasticSearch使用spring-data-elasticSearch的用法
spring-data-Elasticsearch 使用之前,必须先确定版本,elasticsearch 对版本的要求比较高. spring和elasticsearch有两种链接方式,一种是用TCP协 ...
- @click.native 会触发原生 click事件 vue
@click.native 会触发原生 click事件 vue