1 条题解
-
0
自动搬运
来自洛谷,原作者为

EnofTaiPeople
MGXS搬运于
2025-08-24 22:49:48,当前版本为作者最后更新于2023-06-20 18:11:44,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先,我们需要明确胜负判断规则,防止把博和奕搞反,而关键句就是“博让奕,故为零博获胜”。
如果只考虑一次博弈,最初的异或和为零。每当遇到一个奕的数字,如果他选了,那么博必须想办法把这个数字抵消掉,即在后面寻找一个自己的数字集合,将它们取反(即选变不选,不选变选,最开始每个数字都不选)。
如果对于每一个奕的数字,博都能在后面找到抵消方案的话,博就获胜,如果存在一个找不到抵消方案,就是奕获胜。
奕获胜的方法就是,其它的数字都不选,只考虑这个数字选不选。而走到这里时,如果奕选或不选博在后面都有方法应对的话,将这两种方法异或能得出凑出该数的方案,与“找不到抵消方案”矛盾。
找子集异或起来等于给定数字就是异或线性基模板,于是我们能够成功解决一次博弈的胜负了,这样时间复杂度为 ,可以得到 分。( 为二进制位数,下同)
然后你发现如果 ,那么 一定是奕获胜(走到最后,为零就选,否则不选),于是子任务 可以通过,子任务 也可能通过,期望得分 分。
要想得到更高的分,需要从单调性入手,本题的单调性在于固定右端点,左端点一定是前一段奕获胜,后一段博获胜,因为越往左越能找到一个“凑不出的”奕的数字,考虑求出 ,不存在则 。
还有对于一个奕的数字,一定是前一段凑不出,后一段凑得出,这个就太明显了。
可以对于每一个奕的数字都二分找到最后一个凑不出的地方,用线段树或 ST 表套线性基维护。如果对于 来说,最后一个凑不出的地方为 ,就有 ,这里是一个区间最值操作,怎么做都可以。
求出 之后,我们只需要扫右端点,每次对区间 增加 ,然后 的区间和就是答案,这里因为操作简单只需要使用树状数组,瓶颈在于线段树或 ST 表套线性基,为 ,不过特殊性质可以只维护 的,忽略不计,能通过子任务 ,期望得分 分。
上面都不是难点,我们需要优化求 的过程。
从右往左扫,扫到 时,如果 凑不出 那么直接令 , 就没有用了,因为对于后面的 ,由于我们无法凑出 ,因此 。
可以动态维护一个线性基栈,依次是 ,如果 ,就直接将区间 压栈,否则看 能否凑出 ,能就不管,不能就 ,并将 并到 ,继续判断。
这里线性基合并是均摊 的,因为每一个数字只会在每一位插入失败一次。
总时间复杂度 ,空间 。
不强制在线的原因是可持久化空间花费太大,以至于无法体现时间优势。
因为时空限制都是两倍,所以场上也有人写线段树通过,不卡同复杂度的解法。
可以使用前缀线性基做到一样的复杂度,不需要线性基合并。
- 1
信息
- ID
- 8616
- 时间
- 1200ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者