zoukankan      html  css  js  c++  java
  • 【LOJ 6695】天气之子

    找规律题的典范?
    OEIS裸题 考场上让你用 OEIS 吗

    题意

      link

    题解

    (nle 5)

      打表

    (nle 10^5)

      发现不能直接求最优解,于是二分答案。
      验证答案时,先把前 (2) 个人放到 (1,m) 这两个位置,用一个堆维护每相邻两个位置的差值,每新来一个人时,取出最小的差值,均分成两半,各扔进堆。若取出的差值 (le 3) 就判定答案不可行。
      然后考虑二分答案的上界 (R),不难发现 (Rle 3n),因为最终一定不可能存在大于 (3) 的差值,否则可以减小答案。
      时间复杂度 (O(nlog_2 n))

    (nle 10^{18})

      依然二分答案 (m),考虑优化判定。
      手算发现,差值最多只有 (2log m) 种,同一种差值可以一起均分。
      故从大到小递推并累加每种差值的出现次数,若累加到 (n) 时扫到的差值 (le 1) 就判定答案不可行。
      需要用一个堆维护已经出现的差值,每次取最大值。
      时间复杂度 (O(log_2^3 n))

    (nle 10^{1000})

      以下是找规律题解,但做法可能和 loj 的题解不太一样,是 scb 大神犇猜的?(小声bb)
      我们发现把输入和输出交换一下,这似乎就是个简单 ( ext{dp}) 题:设 (f(i)) 表示座位数为 (i),且第一个人坐在中间时最多能不相邻地坐下多少人,则有 $$f(i)=f(lfloor frac{i-3}{2} floor)+f(i-3-lfloor frac{i-3}{2} floor)+1$$
      即选取最中间的一个座位,那么它相邻的两个座位不能用了,剩下 (i-3) 个座位被平分成两半,每一半为一个后继状态。
      然后有 $$ans=f(i-4)+2$$
      即上面的 ( ext{dp}) 转移是每次在一段座位的最中间放一个人,我们最后还要在两端放上一开始的两个人。
      题目是输入 (ans),输出 (i)。于是设 (g)(f) 的逆函数,因为 (ans-2=f(i-4)),所以 (g(ans-2)=i-4),即 (g(ans-2)+4=i)

      考虑如何快速求 (g(n))(nin N+))。
      把 (g) 函数打个表,好像没规律。
      但是把 (g) 函数的每相邻两项的差分值打个表,发现差分值依次为 $$1,3,1,5,1,1,1,9,1,1,1,1,1,1,1,17,1,1,cdots$$
      我们发现这个序列就是在全 (1) 的序列上 把第 (2^1) 位加 (2^1),把第 (2^2) 位加 (2^2),把第 (2^3) 位加 (2^3)……
      由于这是 (g) 的差分序列,前 (n) 项的和就是 (g(n))
      观察和的规律。第 (1) 个数为 (2^0),第 (2-3) 个数的和为 (2^2),第 (4-7) 个数的和为 (2^3),第 (8-15) 个数的和为 (2^4)……
      下标和数值都呈 (2) 的指数级增长。
      若把和看成一个二进制数,这个数不会超过 (log_2{10^{1000}}≈3000) 位。
      由于最后一段是不完整的,我们单提出最后一段求和,再对前面 (log_2) 个整段求和。

      求最后一段前 (k) 个数的和:发现该段第一个数就是上一段的总和 (+1),后面的数全是 (1),故递推时算一下当前扫到的段的和,从上一段的和加上 (k)(1) 就是最后一段前 (k) 个数的和。然后计算 (k) 需要做一次高精度减法,上一段的和加 (k) 又需要做一次高精度加法,故时间复杂度是 (O(3000))
      求前面所有完整段的和:设总共有 (k) 段,则答案为 (2^0+2^2+2^3+cdots +2^k = 2^{k+1} - 1 - 2^1 = 2^{k+1} - 3)。只需要做一次高精度减法,时间复杂度也是 (O(3000))

      最后要把 (3000) 位二进制数转十进制,这个就是从高到低每扫过一个二进制位时,把十进制数 ( imes 2),若这个二进制位为 (1) 则十进制数还要 (+1)
      只有最后的进制转化的时间复杂度最高,是 (O(log_2^2 n) ≈ 9 imes 10^6)。这部分据说可以 ( ext{FFT}) 优化?不会,告辞。
      所以这都是经典数学问题嘛?规律这么神奇的

  • 相关阅读:
    装饰模式
    普元EOS生成WebService时使用自定义实体映射属性
    Mysql字符串查询注意事项(空格敏感及部分字段大小写敏感问题)
    java数组转换为集合-Arrays.asList使用
    Java报异常时getMessage()方法返回null
    118. Pascal's Triangle
    13. Roman to Integer
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/loj6695.html
Copyright © 2011-2022 走看看