标题效果:一些养殖场是由一些南北或东西向的道路互连。

镶上在不断的过程中会问两个农场是什么曼哈顿的距离,假设现在是不是通信。那么输出-1。

思维:并与正确集中检查,f[i]点i至father[i]距离,为了维持两个值,一个是东西向的距离。一个是南北向的距离,由于以后更新的时候要用到。在合并的时候有些特殊。如今有一条边(x->y),设fx为x的根。fy为y的根,那么如今知道f到fx的距离。y到fy的距离。还知道x到y的距离,设fx到fy的距离为dis,则dis + f[y] = f[x] + edge[p].w,那么dis = f[x] - f[y] + edge[p].w。

依据这个公式来合并两个树就能够了。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 40010
using namespace std; struct Complex{
int x,y,len;
char c;
}edge[MAX];
struct Ask{
int x,y;
int pos,_id;
bool operator <(const Ask &a)const {
return pos < a.pos;
}
}ask[MAX];
struct Status{
int x,y; Status(int _,int __):x(_),y(__) {}
Status() {}
Status operator +(const Status &a)const {
return Status(x + a.x,y + a.y);
}
Status operator -(const Status &a)const {
return Status(x - a.x,y - a.y);
}
}f[MAX]; int points,edges,asks;
int father[MAX];
int ans[MAX]; char s[10]; void Pretreatment(); int Find(int x); int main()
{
cin >> points >> edges;
Pretreatment();
for(int i = 1;i <= edges; ++i) {
scanf("%d%d%d%s",&edge[i].x,&edge[i].y,&edge[i].len,s);
edge[i].c = s[0];
}
cin >> asks;
for(int i = 1;i <= asks; ++i)
scanf("%d%d%d",&ask[i].x,&ask[i].y,&ask[i].pos),ask[i]._id = i;
sort(ask + 1,ask + asks + 1);
int now = 1;
for(int i = 1;i <= edges; ++i) {
int fx = Find(edge[i].x);
int fy = Find(edge[i].y);
if(fx != fy) {
father[fy] = fx;
Status temp;
if(edge[i].c == 'N') temp = Status(0,edge[i].len);
if(edge[i].c == 'S') temp = Status(0,-edge[i].len);
if(edge[i].c == 'E') temp = Status(edge[i].len,0);
if(edge[i].c == 'W') temp = Status(-edge[i].len,0);
f[fy] = f[edge[i].x] - f[edge[i].y] + temp;
}
while(i >= ask[now].pos && now <= asks) {
int fx = Find(ask[now].x);
int fy = Find(ask[now].y);
if(fx != fy) ans[ask[now]._id] = -1;
else {
Status temp = f[ask[now].x] - f[ask[now].y];
ans[ask[now]._id] = abs(temp.x) + abs(temp.y);
}
++now;
}
}
for(int i = 1;i <= asks; ++i)
printf("%d\n",ans[i]);
return 0;
} void Pretreatment()
{
for(int i = 1;i <= points; ++i)
father[i] = i;
} int Find(int x)
{
if(father[x] == x) return x;
int temp = father[x];
father[x] = Find(father[x]);
f[x] = f[x] + f[temp];
return father[x];
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

BZOJ 3362 POJ 1984 Navigation Nightmare 并与正确集中检查的更多相关文章

  1. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  2. POJ 1984 Navigation Nightmare 带全并查集

    Navigation Nightmare   Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...

  3. POJ 1984 Navigation Nightmare (数据结构-并检查集合)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4072   Accepted: 1 ...

  4. POJ 1984 - Navigation Nightmare - [带权并查集]

    题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...

  5. POJ 1984 Navigation Nightmare(二维带权并查集)

    题目链接:http://poj.org/problem?id=1984 题目大意:有n个点,在平面上位于坐标点上,给出m关系F1  F2  L  D ,表示点F1往D方向走L距离到点F2,然后给出一系 ...

  6. poj 1984 Navigation Nightmare(带权并查集+小小的技巧)

    题目链接:http://poj.org/problem?id=1984 题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如 ...

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

    Description 给你每个点与相邻点的距离和方向,求两点间的曼哈顿距离. \(n \leqslant 4\times 10^4\) . Sol 加权并查集. 像向量合成一样合并就可以了,找 \( ...

  8. POJ 1984 Navigation Nightmare

    并查集,给n个点和m条边,每条边有方向和长度,再给q个询问,第i个询问查询两个点之间在Ti时刻时的曼哈顿距离(能连通则输出曼哈顿距离,否则输出-1) 这题跟Corporative Network 有点 ...

  9. POJ - 1984 Navigation Nightmare 种类并查集

    思路:记录每个点与其根结点的横向距离和纵向距离,当知道其父节点与根结点的关系,很容易推出当前节点与根结点的关系: 直接相加即可. int p = a[x].par; a[x].dx += a[p].d ...

随机推荐

  1. Eclipse常用设置汇总

    设置编码: . 设置字体: 依次展开 Window->Preferences->Java->Code Style->Formatter  在右边窗口中找到Edit ·找到Lin ...

  2. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  3. 怎么样excel其产生的条形码(10分钟的时间excel)从而出现了条形码

    现在快递行业.京东购物,这样一来,使用条码管理,因此,如何在你的excel其中还生产商品条码管理它?其实很easy,4步骤学会!10分钟搞定. 1.从网址如下.下载字体, 2.双击安装字体. 3,在e ...

  4. 手势(Gesture)的增加和识别

    Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势.Android使用GestureLibrary代表手势库,提供Gestur ...

  5. Java的Log系统介绍和切换(转)

    Java的log系统比较繁杂.在这里梳理一下.本文只涉及log系统介绍和处理log系统之间的切换.不涉及如何配置和使用. 具体的log系统 Log4j:准确的说是log4j 1.x版.是之前使用最广泛 ...

  6. (视频)《高速创建站点》 4.2 完结篇 – 应用运营vs.发射卫星,遥測(Telemetry) 技术

    本文是<高速创建站点>系列的第10篇(完结篇),假设你还没有看过之前的内容,建议你点击下面文件夹中的章节先阅读其它内容再回到本文.訪问本系列文件夹.请点击:http://anb.io/bl ...

  7. DB2 “The transaction log for the database is full” 存在的问题及解决方案

    DB2在执行一个大的insert/update操作的时候报"The transaction log for the database is full.. "错误,查了一下文档是DB ...

  8. state pattern

    6 状态模式总结 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状态转换的细节对于客户端而言是透明的,方便了客户端的使用.在实际开 ...

  9. WPF 图片浏览 伪3D效果

    原文:WPF 图片浏览 伪3D效果 首先上效果图: 因项目要求,需要把图片以"好看"."炫"的效果展示出来,特地研究了一下WPF关于3D方面的制作,奈何最终成果 ...

  10. gradle(转)

    一.声明dependency     在build.gradle文件编辑以下代码: apply plugin: 'java' repositories { mavenCentral() } depen ...