2843. 统计对称整数的数目
这个数据范围实际上可以枚举。
class Solution:
def countSymmetricIntegers(self, low: int, high: int) -> int:
def f(s):
n = len(s)
@cache
def f(i,p,st,is_limit): # i,(suml-sumr),数字起点位置(代替is_num)
if p<0:return 0
if i == n:
return int(st!=-1 and p == 0)
ans = 0
if st==-1:
ans += f(i+1,p,-1,False)
if st != -1 or (n-i)%2 == 0: # 只有偶数长度有意义
up = int(s[i]) if is_limit else 9
down = 1 if st==-1 else 0
if st == -1:
st = i
mid = st+(n-st)//2
d = 1 if i < mid else -1
for j in range(down,up+1):
ans += f(i+1,p+j*d,st,is_limit and up == j)
return ans
return f(0,0,-1,True)
return f(str(high)) - f(str(low-1))
2844. 生成特殊数字的最少操作
class Solution:
def minimumOperations(self, num: str) -> int:
n = len(num)
num = num[::-1]
five = zero = -1
for i,v in enumerate(num):
if v == '5':
if zero != -1:
return i - 1
five = i
elif v == '0':
if zero != -1:
return i-1
zero = i
elif v == '2' or v == '7':
if five != -1:
return i-1
return n - num.count('0')
2845. 统计趣味子数组的数目
class Solution:
def countInterestingSubarrays(self, nums: List[int], modulo: int, k: int) -> int:
n = len(nums)
a = [int(v%modulo==k) for v in nums]
# cnt = [1]+[0]*n # re 下标范围应该是module不是n
cnt = Counter([0])
s = ans = 0
for v in a:
s += v
ans += cnt[(s-k)%modulo]
cnt[s%modulo] += 1
return ans
2846. 边权重均等查询
class Solution:
def minOperationsQueries(self, n: int, edges: List[List[int]], queries: List[List[int]]) -> List[int]:
g = [[] for _ in range(n)]
for u,v,w in edges:
g[v].append((u,w))
g[u].append((v,w))
m = n.bit_length()
pa = [[-1]*m for _ in range(n)]
pre=[[0]*27 for _ in range(n)]
s = [0]*27
depth = [0]*n
def dfs(u,fa,ww):
s[ww] += 1
pre[u] = s[:]
pa[u][0] = fa
for v,w in g[u]:
if v == fa:continue
depth[v] = depth[u] + 1
dfs(v,u,w)
s[ww] -= 1
dfs(0,-1,0)
for j in range(m-1):
for i in range(n):
p = pa[i][j]
pa[i][j+1] = pa[p][j]
def get_kth_ancestor(u,k):
for i in range(k.bit_length()):
if k>>i&1:
u = pa[u][i]
return u
def get_lca(u,v):
if depth[u] > depth[v]:
u,v = v,u
v = get_kth_ancestor(v,depth[v]-depth[u])
if u == v:
return u
for j in range(m-1,-1,-1):
pu,pv = pa[u][j],pa[v][j]
if pu != pv:
u,v = pu,pv
return pa[u][0]
ans = []
# for u,v in queries:
# p = [0]*27
# if depth[u] > depth[v]:
# u,v = v,u
# lca = get_lca(u,v)
# if lca == u:
# for i,(x,y) in enumerate(zip(pre[u],pre[v])):
# p[i] += y-x
# else:
# for i,(x,y,z) in enumerate(zip(pre[u],pre[v],pre[lca])):
# p[i] += y+x-2*z
# p[0] = 0
# ans.append(sum(p)-max(p))
for u,v in queries:
p = [0]*27
lca = get_lca(u,v)
for i,(x,y,z) in enumerate(zip(pre[u],pre[v],pre[lca])):
p[i] += y+x-2*z
ans.append(sum(p)-max(p))
return ans