copy (倒叙离线+bitset+^特性) (hud 2022多校 2)

题目:

给定一个序列 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

 

posted @ 2022-09-05 10:38  VxiaohuanV  阅读(32)  评论(0编辑  收藏  举报