classSolution:deffindThePrefixCommonArray(self, A: List[int], B: List[int])-> List[int]:
cnt = Counter()
ans =[]
s =0for x,y inzip(A,B):
cnt[x]+=1if cnt[x]==2:
s +=1
cnt[y]+=1if cnt[y]==2:
s +=1
ans.append(s)return ans
classBinIndexTree:def__init__(self, size_or_nums):# 树状数组,下标需要从1开始# 如果size 是数字,那就设置size和空数据;如果size是数组,那就是aifisinstance(size_or_nums,int):
self.size = size_or_nums
self.c =[0for _ inrange(self.size +5)]# self.a = [0 for _ in range(self.size + 5)]else:
self.size =len(size_or_nums)# self.a = [0 for _ in range(self.size + 5)]
self.c =[0for _ inrange(self.size +5)]for i, v inenumerate(size_or_nums):
self.add_point(i +1, v)defadd_point(self, i, v):# 单点增加,下标从1开始# self.a[i] += vwhile i <= self.size:
self.c[i]+= v
i += i &-i
defsum_interval(self, l, r):# 区间求和,下标从1开始,计算闭区间[l,r]上的和return self.sum_prefix(r)- self.sum_prefix(l -1)defsum_prefix(self, i):# 前缀求和,下标从1开始
s =0while i >=1:
s += self.c[i]# i -= i&-i
i &= i -1return s
classSolution:defcountOperationsToEmptyArray(self, nums: List[int])->int:
n =len(nums)
ans =0
tree = BinIndexTree(n)for i inrange(1,n+1):
tree.add_point(i,1)
p =1for _,i insorted([(v,i)for i,v inenumerate(nums,start=1)]):if i >= p:
ans += tree.sum_interval(p,i)else:
ans += tree.sum_prefix(i)+ tree.sum_interval(p,n)
tree.add_point(i,-1)
p = i
return ans