思路
给你一个序列 \(a\), 让你选出一些不交的子段, 使得它们的 \(\rm{MEX}\) 的异或和最大
不难发现因为是异或和, 可以简单转化成 \(\mathcal{O} (n^3)\) 的可行性 \(\rm{dp}\)
然后我进行了对固定右端点 \(r\) 一些优化尝试, 发现都比较寄
然后发现这个题, 它, 对, 右端点, 进行优化了
然后就比较难受, 所以自己推一遍
首先掏一个平凡的转移
没错, 现找题解捞的
然后进行一些手推, 不难发现对于固定的 \(i\), 我们可以把 \(\text{mex}\{k, i\}\) 看成下面的形式
在此基础上, 我们不难发现对于同颜色的一段, 我们可以统一对其取可行性, 显然的, 我们可以只取其右端点, 不然实际上仍然不好考虑
本质上是对于 \(f_{i, j}\) 来说, 提取 \(j\) 对应的函数 \(f_j (i)\) 一定是一个先 \(0\) 后 \(1\) 的函数
也就是我们把问题简化到了这样
考虑随着 \(i\) 的变换, 这些右端点会有什么变化呢
考虑对于 \(\text{mex} = c \in [1, n]\) 都维护一个右端点, 只不过有些右端点和左端点重合, 也就类似于这样
考虑这些点随着 \(i\) 的变换怎样变化
形式上来讲, 一些原本并不存在的点会被提出来, 而一些原本存在的点会消失, 而其他的点则不会发生任何变化
因此不难发现我们继承上一个点的状态之后, 只要考虑新出现的点即可, 而那些消失的点则可以直接忽略, 因为你也没有什么操作
那么消失之后再次出现这种情况会不会有影响? 发现可以不再考虑, 因为能转移的都在第一次出现时转移了
形式化的来讲, 就是找到第一次出现的位置
于是终于出现了子问题
子问题
分析题目
给定点 , 要求所有符合要求的点 , 使得区间 满足
区间 是 最小, 最大的区间使得区间
找初步性质
满足要求的区间有多少
假设我们现在有一个好区间 , 他的
我们假设 , 因为 可以类似地讨论
显然, , 除非
显然有 , 因为 肯定不能等于 , 而且如果 , 就可以把 踢出去, 那么 就不是一个好区间
我们假设有一个 , 使得 是一个好区间, 且
这样可能吗? 不可能
因为 , 所以
这就说明, 已经在 中出现了, 不会产生任何贡献, 所以 不是一个好区间
所以我们就证明了, 对于每个 , 至多有一个 , 使得 且 是一个好区间
同时, 这也说明了, 对于每个 , 至多有一个 , 使得 且 是一个好区间
而且, 如果 , 那么 一定不会是上面那两种好区间的端点, 但 本身就是一个好的区间, 它的 为
综上, 好的区间最多只有 个
如何处理
直接枚举即可, 然后在基础上做转移
类似于这样
for (int i = 1; i <= n; i++)for (int j = i; j <= n; j++)if(mex[i][j] != mex[i + 1][j] && mex[i][j] != mex[i][j - 1]) l[j].push_back(i);
总结
这种分段转移问题, 往往可以尝试贪心, 当然直接维护也不失为一种方法
最关键的性质
提取 \(j\) 对应的函数 \(f_j (i)\) 一定是一个先 \(0\) 后 \(1\) 的函数
拥有这种性质的问题, 往往可以大胆地联想到不同 \(r\) 的优化, 也就是变化量这样的
子问题提取法, 谢谢谢谢谢