UOJ #703. 赵云八卦阵
首先我们发现, \(a_i\) 实际上能取到的值是 \(a_i\) 异或上 \(a_1\) 到 \(a_{i-1}\) 任意选取数异或起来能取到的值。
记 \(f_{i}\) 表示长度为 \(i\) 的 LIS 结尾最小是什么,方便起见可以将线性基消成位独立的,这样 \(f_i\) 可以用一个二进制数表示,第 \(i\) 位表示线性基中第 \(i\) 个基底是否异或。
如果 \(a_i\) 可以被 \(1\) 到 \(i-1\) 的线性基表示出来,那么 \(a_i\) 实际上的取值就是目前能表示出来的整个线性空间,有转移 \(f_{i-1}+1\to f_i\),这个可以多个一起转移,只需要转移 \(O(\log a)\) 次。
然后是 \(a_i\) 插入到了 \(1\) 到 \(i-1\) 的线性基内,首先可以更新 \(f_i\) 在现在线性基中的排名,这个只需要看原来的每个基底有没有被当前新的基底消过就行。转移只需要找到比 \(f_i\) 大的,第一个包含 \(a_i\) 的位置,可以用 __builtin_parity_
\(O(1)\) 判断,也只需要加 \(O(1)\) 次就能取到一个位置或者判断无解。
总复杂度 \(O(n\log a_i)\)。