从 l 向右做前缀按位或,结果只会把某些二进制位从 0 变成 1,不会丢失已经出现的 1。因此:
1 的每一位,都必须在某个前缀中出现;0 的每一位,一旦在前缀中出现,该前缀及之后都不可能等于 k。先对每个二进制位做前缀和,即可 O(1) 查询区间 [l,m] 内某位是否出现过。再在 [l,r] 上二分最小的 m,使得 k 中所有为 1 的位都已出现。最后检查该前缀或是否恰好等于 k:每一位该出现的都出现了、不该出现的都没出现。若 k≥230 则直接判不存在。
给定长度为 n 的序列 A。有 Q 次询问,每次给出三个整数 l,r,k,需要判断闭区间 [l,r] 中是否存在下标 i,使得
Al∣Al+1∣⋯∣Ai=k其中 ∣ 表示按位或。若存在,输出满足条件的最小 i;否则输出 -1。下标从 1 开始。
约束条件:
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册