子序列(混合递推+前缀和 || 分块)

Posted jpphy0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子序列(混合递推+前缀和 || 分块)相关的知识,希望对你有一定的参考价值。

问题

  • 序列 a 1 , a 2 , ⋯ , a n a_1,a_2,\\cdots ,a_n a1a2an,求子序列中长度大于1的传奇序列的个数。 1 ≤ n ≤ 3 ∗ 1 0 5 , 0 ≤ a i < 2 18 1\\leq n \\leq 3*10^5, 0\\leq a_i < 2^{18} 1n3105,0ai<218,结果对100000007取余。
  • 若序列 b 1 , b 2 , ⋯ , b k b_1,b_2,\\cdots ,b_k b1b2bk 满足 b i    &    b j = b j    且    i < j b_i\\; \\&\\; b_j = b_j \\;且\\;i<j bi&bj=bji<j ,则称为传奇序列

分析

  • 遍历子序列的一般方式:将子序列按结尾元素分成子空间,子空间数量 O ( n ) O(n) O(n)
  • & \\& & 运算性质
    • a    &    b = b a\\; \\&\\; b = b a&b=b,例如: a = 1110    1010 , b = 1100    0010 a = 1110\\;1010,b = 1100\\; 0010 a=11101010b=11000010
    • a    &    b = b , b    &    c = c a\\; \\&\\; b = b,b\\; \\&\\; c = c a&b=bb&c=c,那么 a    &    c = c a\\; \\&\\; c = c a&c=c
    • 小于 a a a 的最大 b = ( a − 1 )    &    a b = (a-1)\\;\\&\\;a b=(a1)&a,递推式 b i + 1 = ( b i − 1 )    &    a ( b i > b i + 1 ) b_{i+1} = (b_i-1)\\;\\&\\;a\\quad(b_i > b_{i+1}) bi+1=(bi1)&a(bi>bi+1)
    • 大于 b b b 的最小 a = ( b + 1 )    ∥    a a = (b+1)\\;\\|\\;a a=(b+1)a,递推式 a i + 1 = ( a i + 1 )    ∥    a ( a i < a i + 1 ) a_{i+1} = (a_i+1)\\;\\|\\;a\\quad(a_i < a_{i+1}) ai+1=(ai+1)a(ai<ai+1)

暴力枚举

分析

  • f [ i ] f[i] f[i] 是以元素 a i a_i ai 结尾的的满足条件的子序列的数量(元素下标: i i i
  • g [ a ] g[a] g[a] 是以元素 a a a 结尾的的满足条件的子序列的数量(元素值: a a a
  • 则递推过程
    • 到哪里去?
      • g [ a ] g[a] g[a] 定义:能与值为 a a a 的元素构成传奇序列的子序列数量
      • f [ i ] = g [ a i ] + 1 f[i] = g[a_i]+1 f[i]=g[ai]+1
      • g [ a j ] = g [ a j ] + f [ i ] g[a_j] = g[a_j] +f[i] g[aj]=g[aj]+f[i],其中 j ∈ { i , i + k 1 , i + k 2 , ⋯   } , a i    &    a j = a j j \\in \\{i,i+k_1,i+k_2,\\cdots \\},a_i \\;\\&\\;a_j=a_j j{ii+k1i+k2}ai&aj=aj,复杂度 O ( n ) O(n) O(n)
      • 可优化:序列的后续元素中可能不出现值为 a j a_j aj 的元素,能延迟操作更佳;依据查询的“组合”策略,进行组合内修改
    • 从哪里来?