zoukankan      html  css  js  c++  java
  • 正睿十连测 第一天 简要题解

    (A.Stone)
    首先有一个结论是 , 任意一个数 (n) 都可以拆成 (3) 个形如 ({k choose 2}) 的数的和。
    因为 (3k^2 - 3k + 1 = 6{k choose 2} + 1) , 所以对于任意一个数 (n) ,最多需要 (8) 个这样的数就能将其组合出。
    接着, 我们注意到 (6{k choose 2} + 1 equiv 1 (mod 6)) ,那么有 (ans equiv n(mod 6)) , 因此只需判断 (ans)(1) 还是 (8) , 是 (2) 还是 (6)
    注意到 (10^{11}) 内的形如 (3k ^ 2 - 3k + 1) 的数是根号级别的。 于是直接预处理这些数。 对于第一种情况二分求解 , 第二种情况 (two-pointers) 扫描, 即可。
    时间复杂度 : (O(sqrt {limit}))(limit = 10 ^ {11})
    (B. Palindrome)
    首先做一遍 (Manacher) 算法。
    枚举 (1 over 3) 处 , 用扫描线 + (BIT) 维护。
    时间复杂度 : (O(NlogN))
    (C. Random)
    首先我们知道随机树高是 (sqrt n)级别的。
    由期望的线性性质 , 我们不妨对于每个点计算贡献, 那么每个点最多有 (sqrt n) 个祖先。
    问题转化为 ,有一个数组 , (a_{1} , a_{2} , a_{3} , ...... , a_{m}) , 选择一个排列 ,每次将当前数及后面的数加上其权值, 最后问第 (m) 个位置上的数的期望。
    我们发现这个贡献等价于以 (1) 为开头的上升子序列数量 , 那么直接用组合数的一些技巧就行了。
    时间复杂度 : (O(n sqrt n))

  • 相关阅读:
    Servlet编程寄语
    filter常用功能
    Javascript的自动、定时执行和取消
    CentOS 5安装GIT的基本命令
    EF调用执行Oracle中序列
    WCF使用IIS发布服务的配置
    linux 自学系列:debian更新软件列表、更改源
    shell编程笔记五:select
    linux 自学系列: 改IP地址,主机名及DNS
    shell编程笔记四:case in
  • 原文地址:https://www.cnblogs.com/evenbao/p/13585015.html
Copyright © 2011-2022 走看看