获得徽章 0
#刷题交流#
79翻转增益的最大子数组和def solution(N, data_array):
res = -float('inf')
suf = [0] * N
suf[-1] = max(0, data_array[-1])
cur = max(0, data_array[-1])
for i in range(N - 2, -1, -1):
cur += data_array[i]
cur = max(0, cur)
suf[i] = max(suf[i + 1], cur)
#print(suf)
cur = 0
for i in range(N - 1):
cur += data_array[i]
cur = max(data_array[i], cur)
res = max(res, cur + suf[i + 1])
#print(res, max(data_array))
return max(res, max(data_array))
展开
评论
#刷题交流# 299红色格子染色方案数计算 组合数学O(n) 做法!^-^
mod = int(1e9 + 7)
mx = int(1e5 + 10)

# 预处理组合数
fac = [0] * mx
fac[0] = 1
for i in range(1, mx):
fac[i] = fac[i - 1] * i % mod

inv_fac = [0] * mx
inv_fac[mx - 1] = pow(fac[mx - 1], -1, mod)
for i in range(mx - 1, 0, -1):
inv_fac[i - 1] = inv_fac[i] * i % mod

def comb(n, m):
if n < m:
return 0
return fac[n] * inv_fac[m] % mod * inv_fac[n - m] % mod

def solution(n, s):
a = [i for i in range(n) if s[i] == '1']
# 未染色的格子数
cnt = n - len(a)
# 处理首尾
res = comb(cnt, a[0]) * comb(cnt - a[0], n - a[-1] - 1) % mod
cnt -= (a[0] + n - a[-1] - 1)
for i in range(1, len(a)):
k = a[i] - a[i - 1] - 1
if k > 0:
# 内部的方案数和放置的方案数相乘
res *= pow(2, k - 1, mod) * comb(cnt, k) % mod
cnt -= k
return res % mod
展开
1
#刷题交流#
320'icci'型字符串子序列问题 线性复杂度的做法^-^
mod = int(1e9 + 7)
p = set("aeiou")
def solution(s: str) -> int:
cnt = [0] * 26 # 每个字符的计数
triplet = [0] * 26 # 以ch开头的三元组
pairCount = [[0 for _ in range(26)] for _ in range(26)] # i j 二元组
res = 0
for c in s:
x = ord(c) - ord('a')
if c in p:
res = (res + triplet[x]) % mod
if c not in p:
for ch in range(26):
triplet[ch] = (triplet[ch] + pairCount[ch][x]) % mod
for ch in range(26):
pairCount[ch][x] = (pairCount[ch][x] + cnt[ch]) % mod
cnt[x] += 1

return res
展开
评论
#刷题交流#
304计算特定条件下的四元组数量 n^2logn做法,不知道有没有复杂度更优的做法^-^
mod = int(1e9 + 7)
from collections import defaultdict
from bisect import bisect_left
def solution(n: int, a: list) -> int:
d = defaultdict(list)
for i in range(n):
for j in range(i + 1, n):
d[a[i] + a[j]].append(j)
for k in d:
d[k].sort()
res = sum(bisect_left(d[a[i] ^ a[j]], i) for i in range(2, n - 1) for j in range(i + 1, n))
return res % mod
展开
评论
#刷题交流# 272最大化糖果美味值问题。O(1)空间动态规划 ^-^ ^- ^[灵光一现]
def solution(n: int, a: list) -> int:
f1 = f2 = f3 = 0
for i in range(n):
f1, f2, f3 = max(f1, f2, f3 + a[i]), f1, f2
return f1
展开
评论
#刷题交流# 260数字匹配问题 On做法^-^ ^- ^
def solution(N: int, M: int, X: list) -> int:
res = 0
X.sort() # 对列表进行排序
l = 0 # 初始化左指针
for r in range(N // 2, N): # 右指针从中间开始遍历
if X[r] - X[l] >= M and l < N // 2:
res += 1 # 成功配对,计数器加一
l += 1 # 移动左指针,确保数字只被使用一次
return res
展开
评论
#刷题交流# 248小X的区间或值和nlogm做法^-^ ^-^ ^-^
mod = int(1e9 + 7)

def solution(n: int, a: list) -> int:
res = 0
for i in range(max(a).bit_length()):
cnt0 = cnt1 = 0
for j in range(n):
if a[j] >> i & 1:
res += (cnt1 + cnt0) * (n - j) * (1 << i) % mod
cnt1 += j + 1
else:
res += cnt1 * (n - j) * (1 << i) % mod
cnt0 += j + 1
return res % mod
展开
评论
#刷题交流#
246小U走排列问题nlogn做法!

from itertools import accumulate
mod = int(1e9 + 7)
def getSumAbsoluteDifferences(nums):
n = len(nums)
s = list(accumulate(nums))
res = [0] * n # res[i] = 前面的个数 * cur - 前面总和 + 后面的和 - 后面个数 * cur
for i, x in enumerate(nums):
res[i] = (i + 1) * x - s[i] + (s[n - 1] - s[i]) - (n - i - 1) * x
res[i] %= mod
return res

def solution(n: int, a: list) -> int:
if n == 1:
return a[0]
res = 0
a.sort()
dis = getSumAbsoluteDifferences(a)
f = 1
# 计算 (n-2)!
for i in range(1, n - 1): f = f * i % mod
for i in range(n):
res = (res + a[i] * f * (n - 1) + dis[i] * (n - 1) * f) % mod
return res
展开
1
#刷题交流# 236小U的数组权值 On做法
mod = int(1e9 + 7)
from math import ceil
def solution(n: int) -> int:
res = ceil(n / 2) * ceil(n / 2 - 1)
for i in range(1, n): res = (res * i) % mod
return res
展开
1
#刷题交流#
229小U的chi权值计算 O(n)做法
mod = int(1e9 + 7)
def solution(s: str) -> int:
pre = 0
cnt = suf = s.count('?')
prec = 0
sufi = s.count('i')
res = 0
for i in range(len(s)):
if s[i] == 'i':
sufi -= 1
elif s[i] == 'c':
prec += 1
elif s[i] == "h":
# "?"换成chi一共有pow(3, cnt, mod)种可能
# 但是前面的"?" 换成c才有贡献
# 后面的"?"换成i才有贡献
# 1.一定存在的贡献(前面的i)
res += pow(3, cnt, mod) * (prec + sufi)
# 2.前面的?换成c也有贡献
res += pre * pow(3, cnt - 1, mod)
# 3.后面的?换成i也有贡献
res += suf * pow(3, cnt - 1, mod)
else:
# "?" 替换成h的情况
suf -= 1
# 一定存在的贡献
res += pow(3, cnt - 1, mod) * (prec + sufi)
# 前面的?换成c也有贡献
res += pre * pow(3, cnt - 2, mod)
# 后面的?换成i也有贡献
res += suf * pow(3, cnt - 2, mod)
pre += 1

return res % mod
展开
2
下一页
个人成就
文章被点赞 18
文章被阅读 1,689
掘力值 181
收藏集
0
关注标签
2
加入于