CF1056G

题意

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

做法

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

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

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

posted @ 2020-06-04 16:20  Grice  阅读(100)  评论(0编辑  收藏  举报