约翰和他的邻居生活在一个村庄里,他们的道路修建的很特别,都是正东正西或者正南正北,但是呢他们用一种方式描述他们和邻居的位置,比如说 6号 在1号 东面13处,那么我们就可以计算出来这两家的曼哈顿距离,也就是|x-x1| + |y-y1|, 当然这是让我们来求距离的.....
这个约翰也是比较特殊,他会一秒说出来一条道路的位置,当然在说的时候也会有一些查询,查询也是比较特别的,就是给三个参数,第一个第二个是描述的位置,第三个是时间,就是问前这些时间能不能算出他们的距离是多少?不能的话输出 -1 ,能的话输出曼哈顿距离。
分析:首先看这题想的是建立一个坐标系,让根节点是 0 0,然后可以计算根节点和他们之间的距离,不过这样的办法很难区间合并,所以pass,又想了一个办法,直接记录东西南北四个方向的位置,比方说A在B的东20,西40,这样就可以解决合并问题了,只需要把父节点的值加上也可以更新了。
////////////////////////////////////////////////////////+
竟然一下就对了........幸福来得太突然
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<queue>
#include<stack>
using namespace std; const int maxn = ; int f[maxn];
struct Point{int E, N;}val[maxn];//记录相对位置
struct node{int u, v, len, op;}data[maxn];
int dir[] = {, -, -, };//代表东西南北 int Find(int x)
{
    int k = f[x];
    if(f[x] != x)
    {
        f[x] = Find(f[x]);
        val[x].E += val[k].E;
        val[x].N += val[k].N;
    }     return f[x];
}
void Union(int u, int v, int len, int op)
{
    int ru = Find(u), rv = Find(v);     if(ru != rv)
    {
        f[rv] = ru;//别倒着写,因为有方向是B在A的位置
        val[rv].E = -val[v].E + val[u].E + len * dir[op] * (op <  ?  : );
        val[rv].N = -val[v].N + val[u].N + len * dir[op] * (op >  ?  : );
    }
} int main()
{
    int i, N, M;     while(scanf("%d%d", &N, &M) != EOF)
    {
        char s[];         for(i=; i<=N; i++)
        {
            f[i] = i;
            val[i].E = val[i].N = ;
        }         for(i=; i<=M; i++)
        {
            scanf("%d%d%d%s", &data[i].u, &data[i].v, &data[i].len, s);
            if(s[] == 'E')
                data[i].op = ;
            else if(s[] == 'W')
                data[i].op = ;
            else if(s[] == 'S')
                data[i].op = ;
            else
                data[i].op = ;
        }         int Q, u, v, ru, rv;         scanf("%d", &Q);         i = ;
        while(Q--)
        {
            scanf("%d%d%d", &u, &v, &M);             while(i <= M)
            {
                Union(data[i].u, data[i].v, data[i].len, data[i].op);
                i++;
            }             ru = Find(u), rv = Find(v);             if(ru != rv)
                printf("-1\n");
            else
            {
                int ans = (int)(fabs(val[u].E-val[v].E) + fabs(val[u].N-val[v].N));
                printf("%d\n", ans);
            }
        }
    }     return ;

}

I - Navigation Nightmare-poj 1984的更多相关文章

  1. Navigation Nightmare POJ - 1984

    Navigation Nightmare Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usual ...

  2. Navigation Nightmare POJ - 1984 带权并查集

    #include<iostream> #include<cmath> #include<algorithm> using namespace std; ; // 东 ...

  3. 【POJ 1984】Navigation Nightmare(带权并查集)

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

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

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

  5. POJ 1984 Navigation Nightmare 带全并查集

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

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

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

  7. POJ1984:Navigation Nightmare(带权并查集)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7871   Accepted: 2 ...

  8. POJ1984 Navigation Nightmare —— 种类并查集

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

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

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

  10. poj 1984 并查集

    题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...

随机推荐

  1. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  2. asp.net学习之DataList控件

    asp.net学习之DataList控件   DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...

  3. TSQL Challenge 2

    和之前发布的TSQL Challenge 1是同一系列的文章,看到那篇学习哪篇,没有固定的顺序,只为锻炼下思维. Compare rows in the same table and group th ...

  4. 【USACO 2.4.1】两只塔姆沃斯牛

    [题目描述] 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它 ...

  5. Object Storage(Swift)安装过程——Havana

    自从看了Havana安装文档有关Swift的安装一节,发现H版的安装过程与以前还是有些差别的.不过大致过程还是那些.下面简单介绍下我们安装的过程吧,具体请参考官方文档http://docs.opens ...

  6. NoSQL数据库技术特性解析之文档数据库

    现今云计算的从业人员对NoSQL一词并不感到陌生,虽然很多技术人员都长期从事关系数据库的工作,但现在他们对NoSQL技术充满期待.对于企业来说,从关系型数据库到NoSQL数据库转变绝对是个需要深思熟虑 ...

  7. javascript 16/1/14随记

    1.想在一个事件或者函数之后,触发某个事件. var flag=false //定义一个全局变量 function aku(){ if(flag){ } } sizemousedown=functio ...

  8. Bootstrap_排版_文字样式

    一.段落 段落是排版中另一个重要元素之一.在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1.全局文本字号为14px(font-size). 2.行高为1.428 ...

  9. HTML5 input控件 placeholder属性

    placeholder 属性提供可描述输入字段预期值的提示信息(hint),该提示会在输入字段为空时显示,并会在字段获得焦点时消失. <input placeholder="请输入姓名 ...

  10. php设计模式之单例模式

    单例模式顾名思义,就是只有一个实例.作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须自行 ...