发现它,抓住它 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类: D [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为 A [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息需要你回答[a]和[b]是否是同一个团伙所为 注意你获得信息的时间是有先后顺序的,在回答的时候只能根据已经接收到的信息做出判断。 输入描述 第一行是测试数据的数量T(1<=T<=20)。 每组测试数据的第一行包括两个数N和M,分别表示案件的数量和信息的数量,其后M行表示按时间顺序收到的M条信息。 输出描述 对于每条需要回答
```cpp #include <iostream> #include <vector> using namespace std; // 并查集类,用于处理集合合并和查找操作 class UnionFind { private: vector<int> parent; vector<int> relation; public: // 构造函数,初始化并查集 UnionFind(int n) { parent.resize(n + 1); relation.resize(n + 1); for (int i = 1; i <= n; ++i) { parent[i] = i; relation[i] = 0; } } // 查找根节点并进行路径压缩 int find(int x) { if (x != parent[x]) { int px = parent[x]; parent[x] = find(parent[x]); relation[x] = (relation[x] + relation[px]) % 2; } return parent[x]; } // 合并两个元素所在的集合 void unite(int x, int y) { int px = find(x); int py = find(y); if (px != py) { parent[px] = py; relation[px] = (relation[x] + relation[y] + 1) % 2; } } // 判断两个元素的关系 string judge(int x, int y) { int px = find(x); int py = find(y); if (px != py) { return "Not sure yet."; } if (relation[x] == relation[y]) { return "In the same gang."; } return "In different gangs."; } }; int main() { int T; cin >> T; while (T--) { int n, m; cin >> n >> m; UnionFind uf(n); for (int i = 0; i < m; ++i) { char op; int a, b; cin >> op >> a >> b; if (op == 'A') { cout << uf.judge(a, b) << endl; } else if (op == 'D') { uf.unite(a, b); } } } return 0; } ``` 代码解释: 1. 并查集类 `UnionFind`: - `parent` 数组用于记录每个元素的父节点,`relation` 数组用于记录元素与根节点的关系(0 表示在同一团伙,1 表示在不同团伙)。 - `find` 函数用于查找元素的根节点,并进行路径压缩,同时更新 `relation` 数组。 - `unite` 函数用于合并两个元素所在的集合,更新父节点和关系。 - `judge` 函数用于判断两个元素是否在同一团伙,根据根节点和关系数组输出相应结果。 2. 主函数 `main`: - 读取测试数据的数量 `T`。 - 对于每组测试数据,读取案件数量 `n` 和信息数量 `m`。 - 初始化并查集 `uf`。 - 循环读取每条信息,根据信息类型进行相应处理: - 如果是 `A` 操作,调用 `judge` 函数输出结果。 - 如果是 `D` 操作,调用 `unite` 函数合并两个元素所在的集合。 复杂度分析: - 时间复杂度:并查集的查找和合并操作的平均时间复杂度接近 $O(1)$,因此总的时间复杂度为 $O(M \alpha(N))$,其中 $\alpha(N)$ 是阿克曼函数的反函数,近似为常数。 - 空间复杂度:主要使用了 `parent` 和 `relation` 数组,空间复杂度为 $O(N)$。 [2026-02-02 17:28:01 | AI问答 | 894点数解答]
- [字节豆包] 发现它,抓住它 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类: D [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为 A [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息需要你回答[a]和[b]是否是同一个团伙所为 注意你获得信息的时间是有先后顺序的,在回答的时候只能根据已经接收到的信息做出判断。 输入描述 第一行是测试数据的数量T(1<=T<=20)。 每组测试数据的第一行包括两个数N和M,分别表示案件的数量和信息的数量,其后M行表示按时间顺序收到的M条信息。 输出描述 对于每条需要回答(894点数解答 | 2026-02-02 17:28:01)7
- [字节豆包] 【基础】Even More Odd Photos 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 Farmer John 正再一次尝试给他的 N 头奶牛拍照(2≤N≤1000)。 每头奶牛有一个范围在 1…100 之内的整数的「品种编号」。Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。 Farmer John 可以分成的最大组数是多少? 输入描述 输入的第一行包含 N。下一行包含 N 个空格分隔的整数,为 N 头奶牛的品种编号。 输出描述 输出 Farmer John 的照片中的最大组数。可以证明,至少存在一种符合要求的分组方案。 用例输入 1 7 1 3 5 7 9 11 13 用例输出 1 3 提示 输入(841点数解答 | 2026-02-03 15:18:32)4
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内 (571点数解答 | 2025-08-23 20:54:40)192
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内,并且可以增加新的一样的文本(1317点数解答 | 2025-08-23 20:58:40)197
- [字节豆包] [GESP202503 五级] 原根判断 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:未知 分数:100 OI排行榜得分:20(0.1*分数+2*难度) 出题人: 描述 小 A 知道,对于质数 p 而言,p 的原根 g 是满足以下条件的正整数: 1<g<p; g p−1 modp=1; 对于任意 1≤i<p−1 均有 g i modp =1。 其中 amodp 表示 a 除以 p 的余数。 小 A 现在有一个整数 a,请你帮他判断 a 是不是 p 的原根。 输入描述 第一行,一个正整数 T,表示测试数据组数。 每组测试数据包含一行,两个正整数 a,p。 输出描述 对于每组测试数据,输出一行,如果 a 是 p 的原根则输出 Yes,否则输出 No。 用例输入 1 3 3 998244353 5 998244353 7 998244353 用例输出 1 Yes Yes No 提示 【数据范围】 对于 40% 的测试点,保证 3≤p≤10 3 。 对于所有测试(668点数解答 | 2026-02-02 17:30:47)6
- [字节豆包] [GESP202503 五级] 原根判断 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:未知 分数:100 OI排行榜得分:20(0.1*分数+2*难度) 出题人: 描述 小 A 知道,对于质数 p 而言,p 的原根 g 是满足以下条件的正整数: 1<g<p; g p−1 modp=1; 对于任意 1≤i<p−1 均有 g i modp =1。 其中 amodp 表示 a 除以 p 的余数。 小 A 现在有一个整数 a,请你帮他判断 a 是不是 p 的原根。 输入描述 第一行,一个正整数 T,表示测试数据组数。 每组测试数据包含一行,两个正整数 a,p。 输出描述 对于每组测试数据,输出一行,如果 a 是 p 的原根则输出 Yes,否则输出 No。 用例输入 1 3 3 998244353 5 998244353 7 998244353 用例输出 1 Yes Yes No 提示 【数据范围】 对于 40% 的测试点,保证 3≤p≤10 3 。 对于所有测试(511点数解答 | 2026-02-03 17:11:00)7
- [字节豆包] 【NOIP2014 基础】螺旋矩阵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,...,n 2 ,便构成了一个螺旋矩阵。 下图是一个 n=4 时的螺旋矩阵。 ⎝ ⎜ ⎜ ⎜ ⎛ 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 ⎠ ⎟ ⎟ ⎟ ⎞ 现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。 输入描述 共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 输出描述 一个整数,表(289点数解答 | 2026-02-02 17:32:56)6
- [字节豆包] 【NOIP2015 基础】扫雷游戏(mine) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 输入描述 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 输出描述 输出文件包含 n 行,每行 m(545点数解答 | 2026-02-02 17:34:02)9
- [字节豆包] 一本通 1.3 例 5」weight 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:普及 出题人: 描述 已知原数列 a 1 ,a 2 ,⋯,a n 中的前 1 项,前 2 项,前 3 项, ⋯ ,前 n 项的和,以及后 1 项,后 2 项,后 3 项, ⋯ ,后 n 项的和,但是所有的数都被打乱了顺序。此外,我们还知道数列中的数存在于集合 S 中。试求原数列。当存在多组可能的数列时,求字典序最小的数列。 输入描述 第 1 行,一个整数 n 。 第 2 行, 2∗n 个整数,注意:数据已被打乱。 第 3 行,一个整数 m ,表示 S 集合的大小。 第 4 行, m 个整数,表示 S 集合中的元素。 输出描述 输出满足条件的最小数列。 用例输入 1 5 1 2 5 7 7 9 12 13 14 14 4 1 2 4 5 用例输出 1 1 1 5 2 5 提示 数据范围 对于 100% 的数据, 1 <= n <= 1000 ,1 <= m <= 500(716点数解答 | 2026-02-02 17:23:38)6
- [字节豆包] 【基础】高精度减法3 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 16MB,其他语言 32MB 难度:GESP4+/普及- 分数:0 OI排行榜得分:12(0.1*分数+2*难度) 出题人: 描述 处理两个高精度数的减法。(1000位内) 输入描述 两行,每行一个整数。(可能为负数,负号用“-”表示) 输出描述 一个整数,即两个数相减的结果。 用例输入 1 2345678901234 *********012345 用例输出 1 -121111110111111 提示 注意:输入的数可能是负数! 来源 高精度算法(687点数解答 | 2026-01-03 18:40:48)24
- [DeepSeek] n天后的日期 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:语法入门 分数:100 OI排行榜得分:10(0.1*分数+2*难度) 出题人: 描述 设计一程序,输入一个年月日(2023 7 18),输出n天后的日期。 输入描述 输入4个整数,分别是年、月、日和n天 输出描述 输出一行,为n后的日期,以yyyy-mm-dd的格式输出 样例输入 1 2023 7 19 365 样例输出 1 2024-07-18 (305点数解答 | 2025-02-28 17:21:26)278
- [字节豆包] n天后的日期(C++) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:语法入门 分数:100 OI排行榜得分:10(0.1*分数+2*难度) 出题人: 描述 设计一程序,输入一个年月日(2023 7 18),输出n天后的日期。 输入描述 输入4个整数,分别是年、月、日和n天 输出描述 输出一行,为n后的日期,以yyyy-mm-dd的格式输出 样例输入 1 2023 7 19 365 样例输出 1 2024-07-18(436点数解答 | 2025-02-28 17:21:56)236