给出一个正整数序列 A_i ,求一个子区间使得这个区间内的数或起来尽可能的大。 或运算指数字按二进制位进行以下运算: 运算规则: 0|0=0,0|1=1,1|0=1,1|1=1 一个序列的子区间指这个序列中连续的一段数字。 牛牛并不关心这个最大值是多少,他只关心所有满足条件的子区间里,最短的子区间长度是多少。
第一行一个正整数 n ,代表这个序列的长度。 接下来一行空格分隔的正整数 A_i ,用来描述这个序列。 1 ≤ n ≤ 10^6 1 ≤ A_i ≤ 10^9
仅一行一个正整数代表答案。
3 1 2 3
1
考点:双指针
数据规模 n ≤ 1e6 | 限制 2 秒 / 256MB | 标准输入输出
推荐方向:双指针
本题切入点
或值只会随区间扩大而不减,先求出能达到的最大或值,再用双指针找最短的、或值等于该最大值的区间。
用两个指针协同移动,把两层循环的 O(n²) 优化到 O(n)。
思路框架(双指针 通法 · 非本题专属)
实现要点:写成 while (l < r) 循环最清晰,切记每轮至少有一个指针移动,否则死循环。
复杂度:时间 O(n)(排序则 O(n log n)) | 空间 O(1)
该范式的通法易错点
对照本题
样例 1:输入 3 / 1 2 3 → 输出 1
最大值是 3 ,满足条件的子区间为 [1:3],[1:2],[3:3] ,
所以最短的长度为 1 。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:贝壳找房2023届校招开发类试卷。