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
| from typing import List
INF = 100000000
class BinaryIndexedTree: def __init__(self, siz, data): self.tree = [0] * (siz + 1) self.data = data for i in range(1, siz + 1): self.update(i, data[i - 1])
def lowbit(self, x): return x & (-x)
def update(self, i, delta): while i < len(self.tree): self.tree[i] += delta i += self.lowbit(i)
def query(self, i): res = 0 while i > 0: res += self.tree[i] i -= self.lowbit(i) return res
def query_range(self, l, r): return self.query(r) - self.query(l - 1)
class ListNode: def __init__(self, val=0, prev=None, next=None): self.val = val self.prev = prev self.next = next
class Solution: def countOperationsToEmptyArray(self, nums: List[int]) -> int: sorted_nums = nums.copy() sorted_nums.sort() mp = {} for k, v in enumerate(nums): mp[v] = k ans = 0 lst = 0 l = len(nums)
mp_nd = {} head = ListNode(nums[0]) mp_nd[nums[0]] = head now = head for i in range(1, l): now.next = ListNode(nums[i], now) mp_nd[nums[i]] = now.next now = now.next now.next = head head.prev = now
bit = BinaryIndexedTree(l + 2, [0] * (l + 2))
for i in sorted_nums: t = mp[i] if lst == t: ans += 1 else: if lst < t: ans += t - lst - bit.query_range(lst + 1, t + 1) + 1 else: ans += l - lst - bit.query_range(lst + 1, l + 1) \ + t - bit.query_range(1, t) + 1 t_node = mp_nd[i] prev = t_node.prev prev.next = t_node.next bit.update(t + 1, 1) lst = mp[t_node.next.val] return ans
|