杂题

题意

给定一个随机排列(p)(q)次操作
((1)):给定(k),将序列重排列(k)次,一次重排列为:(p'[p[i]]=p[i])
((2)):给定(l,r),求(sumlimits_{i=l}^r p[i])
(n,qle 10^5,kle 10^9)

做法

对操作(2)差分成前缀和

(f(lim,k))为序列总共重排列了k次后(sumlimits_{i=1}^{lim} p[i])
(lim)分块,([1,T],(T,2T],(2T,4T],cdots)
枚举块([st,ed],)对于查询((lim,k)),满足(limin[st,ed]),若在重排列(k)次意义下(sumlimits_{i=1}^{st-1}p[i])已知,则([st,lim])的答案可以(O(T))求出

考虑如何求出在(k=1sim n)(sum_k=sumlimits_{i=1}^{st-1}p[i])
由于排列是随机的,置换中的环个数是(O(logn))的,考虑分环处理
(f_k)(k)意义下,当前环(sumlimits_{i=1}^{st-1}p[i])(f_k=sumlimits_{i=1}^{len}p[x[i]] imes [i移动k次后le st-1])
这个能写成卷积形式

复杂度(O(qT+frac{n}{T}nlogn)),取(T=sqrt{nlogn})最优

原文地址:https://www.cnblogs.com/Grice/p/13142086.html