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
| import random from collections import Counter, defaultdict, deque from datetime import datetime, timedelta from functools import lru_cache from heapq import heapify, heappop, heappush, nlargest, nsmallest from itertools import combinations, compress, permutations, starmap, tee from math import ceil, comb, fabs, floor, gcd, log, perm, sqrt from string import ascii_lowercase, ascii_uppercase from sys import exit, setrecursionlimit, stdin from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union
TYPE = TypeVar('TYPE') N = int(2e5 + 10) M = int(20) INF = int(1e12) OFFSET = int(100) MOD = int(1e9 + 7)
setrecursionlimit(int(2e9))
class Arr: array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)]) array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)]) graph = staticmethod(lambda size=N: [[] for _ in range(size)])
class Math: max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b)
class IO: input = staticmethod(lambda: stdin.readline().rstrip("\r\n")) read = staticmethod(lambda: map(int, IO.input().split())) read_list = staticmethod(lambda: list(IO.read()))
class Std: class SparseTable: def __init__(self, data: list, func=lambda x, y: x | y): """Initialize the Sparse Table with the given data and function.""" self.func = func self.st = [list(data)] i, n = 1, len(self.st[0]) while 2 * i <= n: pre = self.st[-1] self.st.append([func(pre[j], pre[j + i]) for j in range(n - 2 * i + 1)]) i <<= 1
def query(self, begin: int, end: int): """Query the combined result over the interval [begin, end].""" lg = (end - begin + 1).bit_length() - 1 return self.func(self.st[lg][begin], self.st[lg][end - (1 << lg) + 1])
class Solution: def minimumSubarrayLength(self, nums: List[int], k: int) -> int: st = Std.SparseTable(nums, lambda x, y: x | y) n = len(nums) res = INF left = 0 for right in range(n): while left <= right and st.query(left, right) >= k: res = Math.min(res, right - left + 1) left += 1 return res if res != INF else -1
def minimumSubarrayLength(self, nums: List[int], k: int) -> int: st = Std.SparseTable(nums, lambda x, y: x | y) n = len(nums) res = INF for i in range(n): l = Std.bisect.bisect_left(range(i, n), k, lambda y: st.query(i, y)) if l != n - i: res = Math.min(res, l + 1) return res if res != INF else -1
def minimumSubarrayLength(self, nums: List[int], k: int) -> int: ans = inf d = dict() for i, x in enumerate(nums): d = {or_ | x: left for or_, left in d.items()} d[x] = i for or_, left in d.items(): if or_ >= k: ans = min(ans, i - left + 1) return ans if ans < inf else -1
|