3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 121  Solved: 63
[Submit][Status][Discuss]

Description

农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水
平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样,
图中农场用F1..F7表示, 每个农场最多能在东西南北四个方向连结4个不同的农场.此外,农场只处在道路的两端.道路不会交叉且每对农场间有且仅有一条路径.邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复了.每一条道路的信息如下:
从农场23往南经距离10到达农场17
从农场1往东经距离7到达农场17
当约翰重新获得这些数据时,他有时被的鲍伯的问题打断:“农场1到农场23的曼哈顿距离是多少?”所谓在(XI,Yi)和(X2,y2)之间的“曼哈顿距离”,就是lxl - X21+lyl - y21.如果已经有足够的信息,约翰就会回答这样的问题(在上例中答案是17),否则他会诚恳地抱歉并回答-1.

Input

第1行:两个分开的整数N和M.
第2到M+1行:每行包括4个分开的内容,F1,F2,三,D分别描述两个农场的编号,道路的长度,F1到F2的方向N,E,S,w.
第M+2行:一个整数,K(1≤K≤10000),表示问题个数.
第M+3到M+K+2行:每行表示一个问题,由3部分组成:Fi,F2,,.其中Fi和F2表示两个被问及的农场.而/(1≤J≤M)表示问题提出的时刻.J为1时,表示得知信息1但未得知信息2时.

Output

第1到K行:每行一个整数,回答问题.表示两个农场间的曼哈顿距离.不得而知则输出-1.

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

在时刻1,约翰知道1到6的距离为13;在时刻3,1到4的距离仍然不知道;在时刻6,位置6向

北3个距离,向西7个距离于位置2,所以距离为10.

Source

Green

[Submit][Status][Discuss]

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 100003
using namespace std;
int fa[N],disx[N],disy[N],ans[N];
int n,m,q;
struct data{int t,x,y,l,opt,mark;
}a[N],e[N];
int cmp(data a,data b)
{return a.t<b.t;
}
int find(int x)
{if (fa[x]==x) return x;int t=find(fa[x]);disx[x]+=disx[fa[x]];disy[x]+=disy[fa[x]];fa[x]=t;return fa[x];
}
int main()
{freopen("a.in","r",stdin);//freopen("my.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) {char s[10];scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].l,s);char c=getchar();while (c<'A'||c>'Z') c=getchar();switch(c){case 'E':a[i].mark=1;break;case 'W':a[i].mark=2;break;case 'S':a[i].mark=3;break;case 'N':a[i].mark=4;break;}a[i].t=i;a[i].opt=0;}scanf("%d",&q);for (int i=1;i<=q;i++) {scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].t);e[i].l=i;}for (int i=1;i<=n;i++) fa[i]=i;sort(e+1,e+q+1,cmp); int now=1;for (int i=1;i<=q;i++) {//cout<<e[i].x<<" "<<e[i].y<<endl;while (now<=m&&now<=e[i].t) {int r1=find(a[now].x); int r2=find(a[now].y);//  cout<<a[now].x<<" "<<a[now].y<<"!"<<endl;if (r1!=r2) {   fa[r2]=r1; int ans=1;if (a[now].mark==2||a[now].mark==3) ans=-1;if (a[now].mark<=2) disx[r2]=disx[a[now].x]-disx[a[now].y]-ans*a[now].l,disy[r2]=disy[a[now].x]-disy[a[now].y];else disy[r2]=disy[a[now].x]-disy[a[now].y]-ans*a[now].l,disx[r2]=disx[a[now].x]-disx[a[now].y];}now++; }int r1=find(e[i].x); int r2=find(e[i].y);if (r1!=r2) ans[e[i].l]=-1;else {int x=disx[e[i].x]-disx[e[i].y];int y=disy[e[i].x]-disy[e[i].y];ans[e[i].l]=abs(x)+abs(y);}}for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
}

bzoj 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦(加权并查集)相关推荐

  1. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  2. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  3. bzoj3362[Usaco2004 Feb]Navigation Nightmare 导航噩梦

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3362 题目大意: 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤400 ...

  4. POJ 1984 Navigation Nightmare 多权值并查集

    一.内容 Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labe ...

  5. bzoj 3367: [Usaco2004 Feb]The Big Game 球赛(DP)

    3367: [Usaco2004 Feb]The Big Game 球赛 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 56  Solved: 45 ...

  6. bzoj 3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号(思维题)

    3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14  Sol ...

  7. bzoj 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助(set+贪心)

    3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助 Time Limit: 10 Sec  Memory Limit: 128 MB S ...

  8. bzoj 3365: [Usaco2004 Feb]Distance Statistics 路程统计【容斥原理+点分治】

    统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当 ...

  9. 【加权并查集】bzoj 4602 齿轮

    立志用最少的代码做最高效的表达 Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合齿轮,编 ...

最新文章

  1. 1024块TPU在燃烧!BERT训练从3天缩短到76分钟 | 技术头条
  2. 基于Springboot实现宠物医院综合管理系统
  3. linux select系统调用函数分析,Linux select系统调用
  4. python程序默认执行与多线程
  5. concat拼接的坑 mysql_DNSlog注入踩坑记录:
  6. ref与out一看就懂
  7. 为什么jdk的CLASSPATH环境变量需要设置rt.jar 和 tools.jar
  8. STM32 4*4矩阵按键
  9. 板子制作_使用Buildroot制作Ubootamp;Kernelamp;Rootfs
  10. SQL OUTER JOIN概述和示例
  11. 识别数学公式_新品独家发布(免费送码)丨极度公式 数学公式 OCR 识别编辑 LaTeX 公式软件...
  12. 《普林斯顿微积分读本》学习笔记
  13. 多线程常见面试题(含常见项目遇到多线程问题解决及面试对话)
  14. linux安装智能输入法,Ubuntu 8.04中安装智能拼音输入法
  15. 一起教育科技2020净收1.92亿元 官网却启用杂米域名17zyw.cn
  16. 习题6-5 巡逻机器人
  17. python正则表达式(关于提取数字)
  18. 计算机无法检索文件夹,win7系统不能搜索文件夹怎么回事
  19. IText导出PDF添加图片,解决中文问题
  20. 修复登录接口版最新知识付费小程序源码下载-独立后台版本

热门文章

  1. 天龙网游入师门拿福利 师门系统讲解
  2. 谷歌拼音输入法-里程碑式的跃进
  3. 下载 com.mob.sdk:MobSDK 失败处理
  4. VB6 在Win10中 DPI字体125%的时候显示模糊的解决方案
  5. PhotoZoom Classic 7中的新功能
  6. 小程序 多张图片上传(源码分享+实现分析)
  7. C# LiveUpdate.exe实现文件在线更新(原理说明,使用指南一)
  8. k8s的service网络模型
  9. ora-01407 无法更新 值 为null
  10. Python模拟财富分配实验