zoukankan      html  css  js  c++  java
  • 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来做。
    但由于与重叠部分,深度不会平衡。用随机合并+定期重构来做

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

  • 相关阅读:
    互联网资源获取
    Linux tomcat安装
    Linux JDK安装
    Linux入门教程
    windows命令行 查看文件树结构
    Gitea搭建及使用
    Jenkins搭建及使用
    Linux 基础环境搭建
    SpringBoot
    JSON Web Token(JWT)学习
  • 原文地址:https://www.cnblogs.com/Grice/p/13044272.html
Copyright © 2011-2022 走看看