ARC145E
题面
你有一个长度为 的序列 ,你想通过小于等于 次操作使 等于另一个序列 ,或判断无解。
操作为:选择一个 ,对于 。
数据范围 : 。
题解
首先分析一下操作,发现他是对 的一个前缀产生改变,即如果我们让 ,那么就可以不用管 了,所以我们可以考虑从后往前去让每一个 满足。
现在我们考虑最终 的值可以从哪里来。
因为操作是异或,所以如果设 ,那么 就是 的某一个子集 的异或和,并且 。
一定是子集吗?也就是所有情况都取得到吗?
考虑构造,设 序列 ,其中 表示在 中,我们从 遍历到 ,然后保持 的值为 。
- 若 ,下一步操作就是 ,可以看出此时 的值也是上面这一坨。
- 若 ,下一步操作就是 ,此时 而 是上面的这一坨,之后从 合并到 的时候 就会消掉。
所以可以证明所有子集都可以被构造出来。
那么怎么找到子集使 呢?线性基!!!所以就做完了。
但是!这时候我们发现了一个严峻的问题:上面的构造是 一次的,所以理论上最坏复杂度是 的,远远大于 ,而且理论最小值也是 的,怎么会过呢?
但事实是就是能过,不知道是数据水还是有奇怪性质。
有没有复杂度保证的做法呢?
有!
我们发现正着做没法做,因为 每次只会得到 的信息,理论上基本上都是要 的操作的。
这时候,上天(题解)告诉你要反着来,考虑对 操作。
首先看逆操作是什么:
那么 。(如果是 ,那么 。)
那么逆操作就是对于 ,
这时候,我们发现,因为一次操作会给所有 的 发生改变,这就意味着如果我们在构造的时候是可能改变前面的某个 基向量 的值的,这会有影响吗?
答案是没有!
基底的选取有着很高的自由度。具体地,
- 若线性无关,
- 则也是线性无关的。
- 也就是说,基向量相加减依然可以作为基向量。
—— from 王总课件。
那么如果我们考虑从前往后去构造线性基,那么当 作为基向量的时候, 让 任意和 做异或运算, 永远都会是基向量,所以我们可以从前往后先扫一遍,这样我们就求出了一组基底。
现在考虑构造 ,最后一次操作肯定是 ,让 。
考虑如何消除一个 ,发现我们只需要做一次 ,这样 也有一个 ,所以 里就没有 了。
所以我们从后往前依次考虑每一个基向量 ,如果判断 当前 的值不能被 之前的基向量表示,那么就要按上面方法去除掉 。
所以这样就是严格 的复杂度。
启发
- 的逆操作是 。
- 基向量相加减依然可以作为基向量!
本文作者:qwq_123
本文链接:https://www.cnblogs.com/qwq-123/p/16542633.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步