A. 阿尔法
显然只要对位合并,最后查询不同的集合数就好了。
似乎听过一个叫倍增并查集的东西,然而考场上没有$yy$出来。
$f_{k,i}$表示点$i$以及$i$往后数$2^k$个元素共同被合并的祖先。
对于合并操作,直接用ST表的思路合并即可。
考虑最终的下传操作:
枚举倍增的次幂数,设$i$向后$2^k$个元素的祖先为$f$。
因为并查集美妙的性质,在$2^{k-1}$个元素意义下只要分别合并$i$与$f$,$i+2^{k-1}$与$f+2^{k-1}$就好了。
B. 狗
题意不清,就没什么好说的。
C. 集合
$n$个不同的数划分到若干个集合的方案数。
一行第二类斯特林数的和,即贝尔数。
有递推公式$B_{n+1}=sum limits_{i=0}^n inom{n}{i}B_i$。
即钦定最后一个元素划分在最后一个集合中,选出一些元素划分为若干个集合,剩余的元素与最后一个元素划分在一起。
容易发现这个玩意是卷积式,分治FFT就好了,当然用生成函数搞一搞之后多项式求逆也是可以的,当然直接用二项式反演求一行斯特林数搞也是可以的。