题目:
给定一个序列 a1,a2,…,an,共有 q 次操作,每次操作有两种类型:
- 操作1
(1,l,r)
表示复制区间 [l,r] 的内容,在区间 [l,r]的末尾处插入这段内容。 - 操作2
(2,x)
询问当前 ax 的值。
只需要输出所有操作2答案的异或和即可,保证操作1的数量不超过 20000次,初始序列长度不超过 10e5,操作的 l,r,x 均不超过初始序列长度。
思路:
- 操作 l r x 都不会超过 n, n以外就不用管
- 对ans进行^, 那么同一个位置, 只有奇数时才会对ans 做出贡献,既最多贡献一次
- 可以用bitset表示0,1 表示这个位置是否贡献
- 在线操作挪位置,是不好搞的,
- 反向思考,对于目标位置他的实际位置在那?给他诺回去,
- 这样就是挪动贡献位置了, 用bitset很好表示
- 倒序的弄, 遇到 1操作, 就把 r 后面的位置先前面挪动 r-l+1,然后来 ^ 1-r的bitset
- 遇到2,就取反就行了
bitset 相关操作:
- .set() 让所有位 变成1
- .flip(x) 对x取反
- .reset() 所有位 变为0
- .count() 1 的个数
- .any() 是否有1
标签:hud,位置,离线,多校,取反,bitset,操作,贡献 From: https://www.cnblogs.com/Lamboofhome/p/16657264.html