#C1017. 并查集
并查集
并查集(set)
【题目描述】
对于一个长度为 值域为 的数组 ,定义以下两个操作:
- 有返回值的 操作():
- 若 :返回 ;
- 否则,返回进行 操作并将返回值记为 ,令 ,并返回 。
- 无返回值的 操作():
- 进行 操作并令返回值为 ,进行 操作并令返回值为 ;
- 若 ,让 。
给定两个长度为 的数组 和 ,能否通过 次以内的上述两个操作将 变成 ,若可行给出构造方案(保证 , 都可以从一个 的数组通过若干次上述操作得到)
【输入格式】
本题单个测试点有多组测试数据。
从 set.in 输入数据。
第一行一个整数 表示数据组数。
对于每组数据:
第一行一个整数 。
接下来一行 个整数表示 。
接下来一行 个整数表示 。
【输出格式】
输出数据到 set.out。
对于每组数据,若无法满足则输出一行 NO。
否则,第一行输出 YES。
接下来一行一个整数 表示你的操作次数。
接下来 行每行表示操作,每个操作按一下方式输出:
1 x:调用 ;2 x y:调用 。
如果有多种方案请输出任意一种。
【样例 1 输入】
5
3
1 2 3
2 2 3
4
1 2 3 3
1 1 1 2
5
1 2 3 4 5
2 3 4 5 5
5
1 1 1 1 1
1 2 3 4 5
6
1 2 2 4 5 6
1 1 5 1 4 2
【样例 1 输出】
YES
1
2 1 2
YES
4
2 3 2
1 4
2 2 1
1 3
YES
4
2 1 2
2 1 3
2 2 4
2 3 5
NO
YES
7
2 6 2
2 2 5
1 3
2 2 4
1 2
2 2 1
1 2
【样例 2】
见选手目录下的 set/set2.in 与 set/set2.ans。
该样例满足测试点 的约束条件。
【样例 3】
见选手目录下的 set/set3.in 与 set/set3.ans。
该样例满足测试点 的约束条件。
【数据范围】
对于 的数据,满足 ,,,,。
| 测试点编号 | 特殊性质 |
|---|---|
| 无 |
【提示】
下发了个 checker.cpp,保证与评测使用的完全不相同,不保证能正常运行。一般上是这么用的:
打开 powershell,进入当前文件夹;
编译:g++ checker.cpp -o checker -std=c++14 -Wall -O2;
运行:./checker set.in set.out set.ans ,set.in 是输入文件,set.out 是输出文件,set.ans 是答案文件。
过了会输出 AC,没过不会输出 AC。