线性基
模版
习题
在第一个回合中,双方可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。从第二个回合(又轮到第一个游戏者)开始,规则和 Nim 游戏一样。如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。
只要开局异或和不为0就先手必胜,所以利用线性基,如果不能插入,则说明异或和可以为0,所以我们就要把不能插入的都拿走,对火柴进行降序排序,依次插入线性基,对不能插入的求和输出即可。
将所有元素插入线性基内,然后处理所有只有第i位为1的,将rank二进制分解即可。
代码
q次查询区间最大异或和,无修改。
可以建立n个前缀线性基,对于每个二进制位,维护标号最大
区间 \([L,R]\) 的答案为第 \(R\) 个线性基,对于标号都大于等于 \(L\) 的查询结果。
代码
\(m\) 个桶,\(q\) 次操作。
操作 \(1\) 往某桶中放入一个数。
操作 \(2\) 这些桶中的数的最大异或和。
利用线段树维护 \(m\) 个线性基即可。
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | |
P5607 [Ynoi2013] 无力回天 NOI2017 - 洛谷
操作一,区间异或 操作二,区间查询,异或上v的最大值
令 \(b[i]=a[i]\oplus a[i-1]\),则\(a[L]\) 到 \(a[R]\) 之间的线性基等价于 \(b[L+1]\) 到 \(b[R]\) 的线性基再加上一个 \(a[L]\)
修改的话,因为 \(b\) 是差分数组,所以只需要 \(b[L]\oplus =v\) 和 \(b[R+1]\oplus =v\) 即可。
查询,利用线段树求 \(b[L,R]\) 的线性基,再插入 \(a[L]\) 即可。
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | |
倍增,将路径所有点放进线性基求解
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | |
问从 \(1\) 走到 \(n\) 的路径权值的异或和最大值。
先是从 \(1\) 直接走到 \(n\)。此时权值异或和为 \(dist[n]\)。
在这个基础上增广,如果不走环,是不可能到终点的,所以我们选择环来增广。
如果我们走一个环,那么相当于我们选择走这个环的权值为 \(dist[to]\oplus dist[u]\oplus w\)。
插入线性基即可。
本方法也可以求最小XOR和路径。