Skip to content

【01Trie | 有上限排列】P13833 【MX-X18-T5】「FAOI-R6」纯蓝 笔记 ​

前置知识:有上限排列计数。

  • 由异或最值问题,想到 0/1 Trie。

在 0/1 Trie 上考虑能够成为答案的 ai,aj 满足什么性质,容易发现他们的高位是相同的,因此他们在值域上必然是相邻的两个数。

这样子将限制从“任意两个异或最小值”变为“排序后相邻两数异或最小值”。由有上限排列计数(ai=aj 即 f(a)=0 无贡献),启发我们只用 DP 出一个单调递减序列的方案数。

可以发现,当枚举最小值 k 时,DP f(a)=k 不容易,但是 DP f(a)>k 是简单的,似乎可以容斥,但是考虑到最后要求 ∑f(a),本质就是求 ∑k=0+∞[f(a)>k],因此只要 DP 出这个方案数就好了。

设 fi,j 表示考虑到 a 前 i 个大的数,第 i 个是 j 的方案数,则有

fi,j=(c(j)−i+1)∑x>j,x⊕j>kfi−1,x

状态数 O(nV),转移 O(V),需要进行 O(V) 次 DP,时间复杂度 O(nV3),难以接受。考虑优化。

优化状态数 ​

感受一下 0/1 Trie 的过程,这个 k 应该不会很大,因为要求两两异或都能大于 k≥2p,即 V÷2p≥n−1,解得 k≤2V÷n。

因此时间复杂度变为 O(V3)。

优化转移 ​

这个 ∑ 转移使用了 O(V) 的时间,启示使用前缀和、FWT 等科技优化。

考虑瓶颈 x⊕j>k,它必然是前面几位 x[13,h)⊕j[13,h)>k[13,h),后面几位 x[h,0]⊕j[h,0]=k[h,0],对两个条件的判断都没有影响,可以任取。

那么考虑枚举 h 和 j[13,h),计算得 x[13,h)=j[13,h)⊕(k[13,h)+1),对于这一部分相同的 x→j 一次性转移,使用差分和前缀和即可解决。

时间复杂度 O(V2)。

最近更新