[LibreOJ β Round #2]数学上来先打表

数学上来先打表

题解

我们很容易发现,这种构成连通块的查询元素的题很容易用带权并查集来处理。

由于它第三个操作求的是块中第k小的数,如果一个一个查询肯定不好处理,我们需要一种更加高效的查询方式。

于是,我们就想到了分块,将每个点的导值分块,查询时跳着查,到第k所在的那个块时再一个一个查,这样就可以O\left(\sqrt{n} \right )地进行查询了。

而第二个操作要求对这个进行可持久化。我们发现我们对刚做的一个链接操作进行撤回是十分容易的,于是我们可以把所有的操作建成一棵树,如果是返回操作就接在它返回的操作的点上,否则就接在上一个操作上,我们执行时只需要查询遍历这棵树就可以了。

然后我们便可以用O\left(nlog_{n}\sqrt{n} \right )的时间复杂度解决这道题了。虽说这时间复杂度很丑。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include
posted @ 2020-05-19 22:01  StaroForgin  阅读(24)  评论(0)    收藏  举报  来源