题意:

Information

Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 275 Accepted Submission(s): 33

Problem Description
军情紧急,我们需要立刻开发出一个程序去处理前线侦察兵发回的情报,并做出相应的分析。现在由你负责其中的一个子模块,你需要根据情报计算出敌方坦克的位置。

当敌方坦克静止时,侦察兵会尽力估算出它们之间的位置,而每当敌方坦克移动时,侦察兵都会记录下坦克新的位置并向你报告。每个坦克的位置可以由一个二维整数坐标来描述。

前线发回的情报有四种格式:

1 A B X Y

表示A坦克移动到了与B坦克的相对位置是(X,Y)的地方,即XA = XB + X, YA=YB+Y。

2 A X Y

表示A坦克移动到了绝对位置是(X,Y)的地方,即XA = X, YA = Y。

3 A B X Y

表示发现了A坦克与B坦克的相对位置是(X,Y),即XA = XB + X, YA=YB+Y。

4 A X Y

表示发现了A坦克的绝对位置是(X,Y),即XA = X, YA = Y。

我们需要你对于如下两种询问及时做出回应:

5 A B

表示询问A坦克与B坦克的相对位置是多少,即分别求出XA - XB 以及YA -YB

6 A

表示询问A坦克的绝对位置是多少,即求出XA 和YA

其中A和B代表的是任意的一个坦克的编号,(X,Y)表示了坦克的二维坐标。你可以假设初始时刻我们对于敌方任何坦克的位置都一无所知,在此之后坦克的每一次移动都被侦察兵侦察到了。

请注意两个坦克的坐标有可能相同。
Input
输入的第一行是一个整数T(T < 1000),表示共有T组数据。

对于每组数据,第一行有一个整数N,表示这组数据有N次查询。接下来的每行表示一次查询,每次查询第一个数字代表是哪种询问,询问的格式详见上文。

数据范围:

0 < N <=100000, 0<A,B<=N 且 A<>B, X和Y都是整数且 0 <=X,Y<=10000 .

测试数据中98%的数据N不超过50。
Output
对于每组数据,首先需要输出单独一行”Case #?:”,其中问号处应填入当前的数据组数,组数从1开始计算。

对于每一个类型(1)或者(2)的询问,请把它们加入到你的记录中。

对于每一个类型(3)或者(4)的询问,如果与之前记录的内容有矛盾,请输出”REJECT”并将这个情报忽略掉,如没有矛盾,请把它们加入到你的记录中。

对于每一个类型(5)或者(6)的询问,如果根据之前的记录能推出结论,请输出两个整数X和Y,两个整数之间有一个空格;如果不能推出结论,请输出”UNKNOWN”。输出的所有信息都不包括引号。
Sample Input

2
7
1 1 2 3 4
2 3 4 5
3 4 5 2 1
4 6 2 2
3 2 4 6 2
5 4 1
6 3
6
6 3
4 3 2 2
6 3
2 4 2 3
5 3 4
3 3 4 1 2
Sample Output

Case #1:
-9 -6
4 5
Case #2:
UNKNOWN
2 2
0 -1
REJECT

思路:

       这个题目做了好久了,各种纠结,原因是自己吧自己绕道圈子里面了,越绕越复杂

,看到这个题目直接就想到带权并查集,这个毫无疑问,同时还想到1,2都是创建先的节点,但关键是在hash节点和判断当前这个集合时候是已知点的时候sb了,后来蒙了,当时我是标记父亲节点,每次要是有个点是已知的,那么就直接吧他的当前父亲节点标记上,结果各种wa,就这样不知wa了多久,后来看了别人的处理方式,哎!真的是先想好在敲啊,思路直接敲有的时候会死的很惨的啊,对于1,2,是要建立新的节点的,其余的不用,对于已知的点,直接把他父亲连接到0节点上,0节点就表示是已知的(可以是别的自己随意),这样写的时候就简单多了,对于hash点的时候,我是来一个hash一个,不来不用,具体看代码。

#include<stdio.h>

#define N 200000

int
mer[N] ,X[N] ,Y[N] ,hash[N]; int finds(int x)
{
if(
x == mer[x]) return x;
int
t = mer[x];
mer[x] = finds(mer[x]);
X[x] += X[t];
Y[x] += Y[t];
return
mer[x];
} int main ()
{
int
t ,n ,cas = 1;
int
key ,a ,b ,x ,y;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d" ,&n);
printf("Case #%d:\n" ,cas ++);
for(int
i = 0 ;i <= n * 2 ;i ++)
mer[i] = i ,X[i] = Y[i] = 0 ,hash[i] = -1;
int
nown = 0;
hash[0] = 0;
while(
n--)
{

scanf("%d" ,&key);
if(
key == 1 || key == 2)
{
if(
key == 1)
scanf("%d %d %d %d" ,&a ,&b ,&x ,&y);
else
{

scanf("%d %d %d" ,&a ,&x ,&y);
b = 0;
}

hash[a] = ++nown;
if(
hash[b] == -1) hash[b] = ++nown;
int
ra = finds(hash[a]) ,rb = finds(hash[b]);
mer[ra] = rb;
X[ra] = X[hash[b]] - X[hash[a]] + x;
Y[ra] = Y[hash[b]] - Y[hash[a]] + y;
}
if(
key == 3 || key == 4)
{
if(
key == 3)
scanf("%d %d %d %d" ,&a ,&b ,&x ,&y);
else
{

b = 0;
scanf("%d %d %d" ,&a ,&x ,&y);
}
if(
hash[a] == -1) hash[a] = ++nown;
if(
hash[b] == -1) hash[b] = ++nown;
int
ra = finds(hash[a]) ,rb = finds(hash[b]);
if(
ra == rb)
{
if(
X[hash[a]] - X[hash[b]] != x || Y[hash[a]] - Y[hash[b]] != y)
printf("REJECT\n");
}
else
{

mer[ra] = rb;
X[ra] = X[hash[b]] - X[hash[a]] + x;
Y[ra] = Y[hash[b]] - Y[hash[a]] + y;
}
}
if(
key == 5 || key == 6)
{
if(
key == 5)
scanf("%d %d" ,&a ,&b);
else
{

scanf("%d" ,&a);
b = 0;
}
if(
hash[a] == -1) hash[a] = ++nown;
if(
hash[b] == -1) hash[b] = ++nown;
int
ra = finds(hash[a]) ,rb = finds(hash[b]);
if(
ra != rb) printf("UNKNOWN\n");
else
printf("%d %d\n" ,X[hash[a]] - X[hash[b]] ,Y[hash[a]] - Y[hash[b]]);
}
}
}
return
0;
}

hdu4829 带权并查集(题目不错)的更多相关文章

  1. 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集

    [题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...

  2. 浅谈并查集&种类并查集&带权并查集

    并查集&种类并查集&带权并查集 前言: 因为是学习记录,所以知识讲解+例题推荐+练习题解都是放在一起的qvq 目录 并查集基础知识 并查集基础题目 种类并查集知识 种类并查集题目 并查 ...

  3. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  4. poj1984 带权并查集(向量处理)

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

  5. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

  6. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  7. hdu 1829-A Bug's LIfe(简单带权并查集)

    题意:Bug有两种性别,异性之间才交往, 让你根据数据判断是否存在同性恋,输入有 t 组数据,每组数据给出bug数量n, 和关系数m, 以下m行给出相交往的一对Bug编号 a, b.只需要判断有没有, ...

  8. Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集

    C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...

  9. Codeforces Round #181 (Div. 2) B. Coach 带权并查集

    B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...

随机推荐

  1. 敏捷史话(八):敏捷的破局之道——Martin Fowler

    在 Martin Fowler 的世界里,任何事情都有最优解. 1963年,Martin 出生于英格兰的沃尔索尔(Walsall),也在同样位于沃尔索尔的玛丽女王文法学校中接受中等教育.在这里的乡村中 ...

  2. POJ-3468(线段树+区间更新+区间查询)

    A Simple Problem With Integers POJ-3468 这题是区间更新的模板题,也只是区间更新和区间查询和的简单使用. 代码中需要注意的点我都已经标注出来了,容易搞混的就是up ...

  3. HDOJ-6651(数学推导)

    Final Exam HDOJ-6651 这里主要考察我们的思维能力,要想自己至少可以通过k道题目,那么可以从老师的角度出发:怎么才能尽可能让你每一道题目都不通过,但是分数却是固定的. 假设我们每道题 ...

  4. MySQL中如何查询中位数

    员工薪水中位数 题目描述: 预期答案: 解法1 既然是求解中位数,我们首先想到的是根据中位数的定义进行求解:奇数个数字时,中位数是中间的数字:偶数个数字时,中位数中间两个数的均值.本题不进行求解均值, ...

  5. 使用 Android Studio 的日志工具 Log

    •Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 And ...

  6. Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序

    一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...

  7. [GDKOI2021] 提高组 Day 2 总结

    [ G D K O I 2021 ]    提 高 组    D a y   2    总 结 不明的感觉今天的题比昨天的简单些,感觉今天爆炸的可能性很低. 嗯,于是乎,就很自信地打完了比赛.然后下午 ...

  8. web编辑工具 - Brackets - 强大免费的开源跨平台Web前端开发工具IDE

      简单使用可以参考: https://blog.csdn.net/melon19931226/article/details/68066971/ https://www.iplaysoft.com/ ...

  9. java面试一日一题:如何优化sql

    问题:请讲下在mysql下如何优化sql 分析:该问题主要考察对mysql的优化,重点考虑对索引优化的掌握. 回答要点: 主要从以下几点去考虑, 1.什么样的sql需要优化? 2.怎么对sql进行优化 ...

  10. 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...