当前位置: 首页 > news >正文

并查集 - ## Find them, Catch them

Description

塔杜市警察局决定采取行动终结混乱,开展行动以根除市内的两个帮派:Dragon 帮和 Snake 帮。然而,警方首先需要确定一个罪犯属于哪个帮派。现在的问题是,给定两个罪犯,他们是否属于同一个帮派?你必须根据不完整的信息给出判断(因为歹徒总是秘密行动)。

假设塔杜市现有 \(N\) 个罪犯,编号从 \(1\)\(N\)。当然,Dragon 帮和 Snake 帮都至少有一名成员。你将按顺序收到 \(M\) 条信息,信息分为以下两类:

  1. D [a] [b]
    其中 \([a]\)\([b]\) 是两个罪犯的编号,这条信息表明他们属于不同的帮派

  2. A [a] [b]
    其中 \([a]\)\([b]\) 是两个罪犯的编号,这条信息需要你回答 \(a\)\(b\) 是否属于同一个帮派


Input

第一行包含一个整数 \(T\)\(1 \le T \le 20\)),表示测试用例的数量。

随后是 \(T\) 组测试用例。每组测试用例的第一行包含两个整数 \(N\)\(M\),接下来 \(M\) 行,每行包含一条信息,格式如上所述。


Output

对于每个测试用例中的每条 A [a] [b] 信息,你的程序应根据在此之前获得的信息给出判断。答案可能是以下三者之一:

  • "In the same gang."(属于同一个帮派)
  • "In different gangs."(属于不同帮派)
  • "Not sure yet."(关系不确定)

Sample Input

1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4

Sample Output

Not sure yet.
In different gangs.
In the same gang.

数据范围

  • \(1 \le N \le 10^5\)
  • \(1 \le M \le 10^5\)
  • \(1 \le a, b \le N\)

解题思路提示

这是一道经典的种类并查集(或带权并查集)问题。由于只有两个帮派,可以使用以下技巧:

  • 将每个罪犯 \(x\) 拆分成两个点:\(x\) 表示其在 Dragon 帮,\(x + N\) 表示其在 Snake 帮。
  • 对于 D a b 操作:
    • 合并 \(a\)\(b + N\)(a 在 Dragon 则 b 在 Snake)
    • 合并 \(a + N\)\(b\)(a 在 Snake 则 b 在 Dragon)
  • 对于 A a b 查询:
    • 如果 \(find(a) == find(b)\),则属于同一帮派
    • 否则如果 \(find(a) == find(b + N)\),则属于不同帮派
    • 否则关系不确定
#include <bits/stdc++.h>
using namespace std;
int T;int Fa[200002];
int GetFa(int k) {if (k==Fa[k]) return k;return Fa[k]=GetFa(Fa[k]);
}
void Merge(int x,int y) {int fx=GetFa(x);int fy=GetFa(y);if (fx!=fy) Fa[fy]=fx;
}
int main() {cin>>T;while (T--) {int n,m;cin>>n>>m;char ch;int a,b;for (int i=1;i<=n+n;i++) Fa[i]=i;for (int i=1;i<=m;i++) {scanf(" %c%d%d",&ch,&a,&b);if (ch=='D') {Merge(a,b+n);Merge(a+n,b);}if (ch=='A') {int f1,f2,f3,f4;f1=GetFa(a);f2=GetFa(b);f3=GetFa(a+n);f4=GetFa(b+n);if (f1==f2 || f3==f4) cout<<"In the same gang."<<endl;if (f1==f4 || f2==f3) cout<<"In different gangs."<<endl;if (f1!=f4 && f1!=f2) cout<<"Not sure yet."<<endl;}}}return 0;
}
http://www.jsqmd.com/news/390391/

相关文章:

  • (3-2)机器人身体结构与人体仿生学:人形机器人躯干体系
  • 气泡图标注软件中文版(美式功能设计)|一键插入序号气泡图,支持CAD/PDF/图片+OCR识别+Excel报告导出
  • EncodeConvert编码转换器v2.0——高效支持GBK与UTF-8互转的汉字编码工具
  • ZProtect一机一码工具(电脑版):专为DLL/EXE文件设计的轻量级软件开发解决方案
  • 未来之窗昭和仙君(七十二)前端交互异常行为检测—东方仙盟练气
  • 冥想第一千七百九十七天(1797)
  • 冥想第一千七百九十六天(1796)
  • ROS快速入门教程:什么是SLAM(Simultaneous localization and mapping,同步定位与建图)【解决机器人在未知环境运动时的定位与地图构建问题】
  • OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发
  • 工业园区全域轨迹拼接与异常行为智能识别平台——跨摄像单元轨迹连续性校验 × 多帧误差补偿引擎
  • Agentic AI时代,提示工程架构师的核心竞争力是什么?
  • 如何提升企业品牌在豆包结果中的排名? - 品牌2025
  • 寒假19
  • VSCode 配置 MinGW 搭建 C++ 开发环境
  • 基于SSM的蛋糕私人订制网站[SSM]-计算机毕业设计源码+LW文档
  • 领略大数据领域数据科学的数据清洗技巧
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理
  • 基于SSM的传智健康系统[SSM]-计算机毕业设计源码+LW文档
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3 —— 基于 Operator 实现 GPU 竞价实例资源池调度管理
  • 论文浅读(第一期)|摘自<<LOOpy Hell(ow):Infinite Traffic Loops at theApplication Layer>>(第三节) - 指南
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战
  • Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现
  • HTML 脚本:构建交互式网页的基石
  • Scala IF...ELSE 语句详解
  • XSL 语言
  • 大数据领域时序分析:应对海量时间序列数据的挑战
  • Objective - C 在移动开发中的动画缩放与旋转
  • 基于yolov8学生课堂考勤专注检测系统+用的resnet神经网络
  • 基于YOLOV8的行人检测与跟踪系统
  • Day36获取元素大小位置的另外方法