CF1056G

题意

给定(n,m,s,t)(1sim n)的环形位置,(1sim m)为红色,(m+1sim n)为蓝色,初始在(s),时间戳(t)
(1):若当前在红色,则向前走(t),否则向后走
(2):(t--),若(t=0)则退出
(3le nle 10^5, 1le m<n)(1le sle n, 1le tle 10^{12})

做法

(t)分成三部分:(tsim t-t\% n)(t-t\%nsim 0)
前半部分是(O(n))级别的,可以暴力做
(t-t\%n=kn)
若能得到当前在(x),时间戳(nsim 1)后的位置。(t-t\%nsim 0)可以通过倍增得到

(f_{i,j})为当前在(i),经过时间戳(jsim 1)后的位置
(f_{?,j-1})更新(f_{?,j})(f_{i,j}=f_{i+j,j-1}(iin[1,m]))(f_{i,j}=f_{i-j,j-1}(iin(m,n]))
这相当于数组拆成大概(4)段,然后拼接起来。这(4)段有重叠部分,用可持久化treap来做。
但由于与重叠部分,深度不会平衡。用随机合并+定期重构来做

不太明白为什么不会平衡,也不明白为什么随机合并后还不会平衡...

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