Information
时间限制: 1s 内存限制: 65536K
问题描述
军情紧急,我们需要立刻开发出一个程序去处理前线侦察兵发回的情报,并做出相应的分析。现在由你负责其中的一个子模块,你需要根据情报计算出敌方坦克的位置。
当敌方坦克静止时,侦察兵会尽力估算出它们之间的位置,而每当敌方坦克移动时,侦察兵都会记录下坦克新的位置并向你报告。每个坦克的位置可以由一个二维整数坐标来描述。
前线发回的情报有四种格式:
1 A B X Y
表示A坦克移动到了与B坦克的相对位置是                              的地方,即 。
2 A X Y
表示A坦克移动到了绝对位置是 的地方,即 , 。
3 A B X Y
表示发现了A坦克与B坦克的相对位置是 ,即 。
4 A X Y
表示发现了A坦克的绝对位置是 ,即 , 。
我们需要你对于如下两种询问及时做出回应:
5 A B
表示询问A坦克与B坦克的相对位置是多少,即分别求出 以及 。
6 A
表示询问A坦克的绝对位置是多少,即求出 。
其中A和B代表的是任意的一个坦克的编号,(X,Y)表示了坦克的二维坐标。你可以假设初始时刻我们对于敌方任何坦克的位置都一无所知,在此之后坦克的每一次移动都被侦察兵侦察到了。请注意两个坦克的坐标有可能相同。
输入
输入的第一行是一个整数T(T< 1000),表示共有T组数据。
对于每组数据,第一行有一个整数N,表示这组数据有N次查询。接下来的每行表示一次查询,每次查询第一个数字代表是哪种询问,询问的格式详见上文。
数据范围:
,X和Y都是整数且
测试数据中98%的数据N不超过50。
输出
对于每组数据,首先需要输出单独一行”Case#?:”,其中问号处应填入当前的数据组数,组数从1开始计算。
对于每一个类型(1)或者(2)的询问,请把它们加入到你的记录中。
对于每一个类型(3)或者(4)的询问,如果与之前记录的内容有矛盾,请输出”REJECT”并将这个情报忽略掉,如没有矛盾,请把它们加入到你的记录中。
对于每一个类型(5)或者(6)的询问,如果根据之前的记录能推出结论,请输出两个整数X和Y,两个整数之间有一个空格;如果不能推出结论,请输出”UNKNOWN”。输出的所有信息都不包括引号。
样例输入
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
样例输出
Case #1:
-9 -6
4 5
Case #2:
UNKNOWN
2 2
0 -1
REJECT
解题报告 –Information
这题的算法并不复杂,主要就是一个并查集的使用,不过写的时候要注意很多细节。每个Tank的状态可以分3种情况:
1.      未初始化,不在任何集合里;
2.      在一个互相间已知相对位置的集合里;
3.      已知绝对位置。
具体的处理规则如下:
1.      1A B X Y
1)        如果A原来在一个集合里,把它从这个集合移除;
2)        根据B的情况:
a)        如果B已知绝对位置,设置A的绝对位置;
b)        如果B不在任何集合里,则创建一个集合,把A、B都加入,并设置相对位置;
c)        如果B已经在一个集合里,则把A加入这个集合,并设置相对位置;
2.  2 A X Y
1)        如果A原来在一个集合里,把它从这个集合移除;
2)   设置A的绝对位置;
3.  3 A B XY
1)   如果A和B其中一个不在任何集合里,则等于把其移到另一个的相对位置上,和类型1的处理流程一样;
2)   如果A和B都有绝对位置或者在同一个集合里,判断他们的相对位置是否和这次发现的一致,如果不一致,输出REJECT,忽略本次操作;
3)   如果A和B其中一个有绝对位置,则可以把另外一个所在集合里的所有Tank都设置绝对位置;
4)   如果A和B在不同的集合里,则把其中一个集合合并到另一个集合,并更新所有Tank的相对位置;
4.  4 A X Y
1)   如果A已经有绝对位置,判断他的绝对位置是否和这次发现的一致,如果不一致,输出REJECT,忽略本次操作;
2)   如果A不在任何集合内,设置A的绝对位置即可;
3)   如果A在一个集合内,设置这个集合里的所有Tank的绝对位置;
5.  5 A B
1)   如果A和B都有绝对位置或者在同一个集合里,输出他们的相对位置;
2)   否则输出UNKNOWN;
6.  6 A
1)   如果A有绝对位置,输出A的绝对位置;
2)   否则输出UNKNOWN。

解题代码:

#include <set>
#include <string>
#include <stdio.h>
using namespace std;struct Tank {int id;int x;int y;
};Tank tank[100005];
int id;
set<int> tanks[100005];
FILE* fout = NULL;void insert(int m, int a, int b, int x, int y) {if (m == 1) {if (tank[b].id == -2) {tank[b].id = id++;tank[b].x = tank[b].y = 0;tanks[tank[b].id].insert(b);}if (tank[a].id >= 0) {tanks[tank[a].id].erase(a);}tank[a].id = tank[b].id;if (tank[a].id >= 0) {tanks[tank[a].id].insert(a);}tank[a].x = tank[b].x + x;tank[a].y = tank[b].y + y;}else if (m == 2) {if (tank[a].id >= 0) {tanks[tank[a].id].erase(a);}tank[a].id = -1;tank[a].x = x;tank[a].y = y;}else if (m == 3) {if (tank[a].id == -2) {insert(1, a, b, x, y);}else if (tank[b].id == -2) {insert(1, b, a, -x, -y);}else if (tank[a].id == -1 && tank[b].id == -1) {if (tank[a].x != tank[b].x + x || tank[a].y != tank[b].y + y) {fprintf(fout, "REJECT\n");}}else if (tank[a].id == -1) {insert(4, b, -1, tank[a].x - x, tank[a].y - y);}else if (tank[b].id == -1) {insert(4, a, -1, tank[b].x + x, tank[b].y + y);}else {if (tank[a].id == tank[b].id) {if (tank[a].x != tank[b].x + x || tank[a].y != tank[b].y + y) {fprintf(fout, "REJECT\n");}}else {int dx = tank[b].x + x - tank[a].x;int dy = tank[b].y + y - tank[a].y;int j = tank[a].id;int k = tank[b].id;for (set<int>::const_iterator itr = tanks[j].begin(); itr != tanks[j].end(); itr++) {tank[*itr].id = tank[b].id;tank[*itr].x += dx;tank[*itr].y += dy;tanks[k].insert(*itr);}set<int> temp;tanks[j].swap(temp);}}}else if (m == 4) {if (tank[a].id == -1) {if (tank[a].x != x || tank[a].y != y) {fprintf(fout, "REJECT\n");}}else if (tank[a].id == -2) {tank[a].id = -1;tank[a].x = x;tank[a].y = y;}else {int dx = x - tank[a].x;int dy = y - tank[a].y;int j = tank[a].id;for (set<int>::const_iterator itr = tanks[j].begin(); itr != tanks[j].end(); itr++) {tank[*itr].id = -1;tank[*itr].x += dx;tank[*itr].y += dy;}set<int> temp;tanks[j].swap(temp);}}
}void query(int m, int a, int b) {if (m == 5) {if (tank[a].id > -2 && tank[b].id > -2 && tank[a].id == tank[b].id) {fprintf(fout, "%d %d\n", tank[a].x - tank[b].x, tank[a].y - tank[b].y);}else {fprintf(fout, "UNKNOWN\n", m, a, b);}}else {if (tank[a].id == -1) {fprintf(fout, "%d %d\n", tank[a].x, tank[a].y);}else {fprintf(fout, "UNKNOWN\n", m, a);}}
}int main() {int T, N, t = 1;int m = 0, a = 0, b = 0, x = 0, y = 0;FILE* fp = stdin; //fopen("data.in", "r");fout = stdout; //fopen("output", "w");fscanf(fp, "%d", &T);while (T--) {fscanf(fp, "%d", &N);for (int i = 0; i <= N; i++) {tank[i].id = -2;}id = 0;fprintf(fout, "Case #%d:\n", t++);while (N--) {fscanf(fp, "%d", &m);if (m == 1 || m == 3) {fscanf(fp, "%d %d %d %d", &a, &b, &x, &y);insert(m, a, b, x, y);}else if (m == 2 || m == 4) {fscanf(fp, "%d %d %d", &a, &x, &y);insert(m, a, b, x, y);}else if (m == 5) {fscanf(fp, "%d %d", &a, &b);query(m, a, b);}else if (m == 6) {fscanf(fp, "%d", &a);query(m, a, b);}}for (int i = 0; i < id; i++) {set<int> temp;tanks[i].swap(temp);}}
}

转载于:https://www.cnblogs.com/hosealeo/p/4190509.html

2014百度之星初赛第一轮解题报告:information相关推荐

  1. 2021百度之星初赛第一场部分题解

    写在前面 几个家长要求我写一些2021百度之星初赛第一场的题解. 1003 鸽子 原题链接 https://acm.hdu.edu.cn/showproblem.php?pid=6998 http:/ ...

  2. 51nod 1515 明辨是非 2017百度之星初赛第一场第二题(并查集+启发式合并)

    题目: 原题链接 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变 ...

  3. 2014 百度之星 资格赛 第一题 Energy Conversion 解题思路

    本次比赛的资格赛似乎比以往来的要稍微难一点,但是整体来说,每道题想到解题思路都不是很难,但是在具体的代码编写过程中需要注意的细节尤为重要.下面先将第一题的题目贴出: [Time Limit: 2000 ...

  4. 2017百度之星初赛第一场题解

    前言 这场比赛我卡在线上了,没有进TAT 我只做了三道水题.. 首先是在比赛开始的时候我还在睡觉,我以为是2:30开始.. 然后,由于这个垃圾评测,卡死人了.. 于是我刷新一下,就算了我交了两次,于是 ...

  5. 2018百度之星初赛B轮 p1m2

    p1m2 Accepts: 954 Submissions: 4063 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1310 ...

  6. [水]2015百度之星初赛第一场 超级赛亚ACMer

    Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度.
所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升.
 具 ...

  7. 2014百度之星资格赛第一题

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 【百度之星2020】Mosquito 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6749 (占个坑,有空再更新题解) Dinic: #include<cstdio> #inc ...

  9. 2016百度之星 - 初赛(Astar Round2B)解题报告

    此文章可以使用目录功能哟↑(点击上方[+]) 被自己蠢哭,去年还能进一下复赛,今年复赛都没戏了... 链接→2016"百度之星" - 初赛(Astar Round2B)  Prob ...

最新文章

  1. photoshop小结
  2. js_sqlite_ADODB.Connection
  3. C# 学习笔记(16)ComboBox下拉列表框宽度自适应
  4. Ubuntu中清理Network下Connect to Server的入口
  5. c语言指针的相关运算,C语言指针的运算
  6. 关于移动端页面强制竖屏
  7. 关于样式表setStyleSheet
  8. 《Essential C++》笔记之return;分析
  9. hacker基础教程
  10. JDBC学习(四、DAO思想和重构设计上)
  11. 如何修复win7蓝牙服务器,高手亲自解决win7卸载蓝牙驱动的修复操作
  12. RPLIDAR最强参数详解
  13. ant design vue 中a-tree搜索查询
  14. ultravnc download windows 7,ultravnc download windows 7软件的4大优势
  15. 信号处理:希尔伯特-黄变换
  16. hive报错:Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  17. 标准化互信息NMI计算步骤及其Python实现
  18. python 构件二维数组_通过这四个构件块来升级您的javascript数组
  19. Nginx 相关问题(持续更新一:Cookie问题)
  20. CSS样式大全(网络收集整理)

热门文章

  1. avast关闭DeepScreen
  2. 数据中台落地实施之法
  3. linux运行echo,Linux中echo命令起什么作用呢?
  4. 游戏更新一直卡在计算机,游戏卡卡卡?教你解决电脑玩游戏一直跳ping的问题...
  5. javaweb基于JSP+Servlet房地产客户关系管理系统(CRM) 大作业 课程设计 毕业设计
  6. 闲谈项目管理之项目计划篇
  7. 祝学校计算机系的新年贺词,新年祝福语:学校领导新年贺词大全
  8. 【信号与系统】(五)连续系统的时域分析 —— LTI连续系统的响应
  9. 新一代设备管理软件EAM,支持无代码非标准化业务定制
  10. Windows 10 侧边任务栏宽度调整