把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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)\)

submission

posted @ 2024-06-26 20:08  275307894a  阅读(34)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end