第一道自己出的数据结构,并且一发过了大样例的题目。
以及自创的第二个玄学数据结构。
题目描述
指定一种数据结构,要求支持以下操作:
1.向这个数据结构内加入一个新元素,并为其指定一个所属集合
2.合并分属于集合$i$和集合$j$的元素。
3.输出某一个集合$i$内权值最大的数
注:程序开始时,该数据结构为空
输入输出格式
输入格式
第一行,一个正整数$n$,表示有$n$个操作。
第$2$到$n+1$行,每行有两个或三个元素:
1 x y
表示将新元素$x$加入到编号为$y$的集合中2 i j
表示合并编号分别为$i$和$j$的集合,表示把$j$集合以内的元素合并到$i$集合中3 i
表示输出编号为$i$的集合内权值最大的元素,如果不存在指定集合,输出-1。
输出格式
每一个操作3
的答案。
INPUT & OUTPUT‘s example s
Input’s eg #1
1 | 10 |
Output’s eg #1
1 | 4 |
说明
对于$50 \%$的数据,$1 \leq n \leq 10^3$
对于$100 \%$的数据,$1 \leq n \leq 2 \times 10^5$
分析
本题就是一道Payphone-XSet
的板子题,至于这种玄学数据结构到底是怎么样的,嗯嗯,我还是讲讲吧。
首先,Payphone-XSet
可以支持的操作有:
- 将一个值插入一个集合中,如果当前没有此集合,那么就新建一个集合。
- 求一个集合的元素数量,最大值,最小值,和。。。
- 合并两个集合。
- 销毁一个集合。
- 返回一个元素属于哪一个集合
时间复杂度均为$O(1)$,空间复杂度为$O(n)$。
似乎,有点像并查集,但显然没有并查集强大。
不多说了,直接上代码,绝对简单易懂,玄学到死。
代码
1 | /* Headers */ |