记录学习日常
壁画
t = int(input())
arr = [[int(input()), list(map(int, input()))] for _ in range(0, t)]
res = []
for i in range(0, t):
n,score = arr[i]
# 生成前缀和
score_sum = [0]
for j in range(1, n + 1):
score_sum.append(score[j - 1] + score_sum[j - 1])
div = (n+1) // 2
result = 0
# 寻找最优解
for j in range(div, n+1):
result = max(result, score_sum[j] - score_sum[j-div])
print("Case #%d: %d"%(i+1,result))
AcWing 1230. K倍区间
from collections import Counter
n, k = map(int, input().split(" "))
arr = [0]+[int(input()) for _ in range(0, n)]
# 构造前缀和,利用同余定理
for i in range(1, n+1):
arr[i] = (arr[i] + arr[i - 1]) % k
arr_set = Counter(arr)
res = 0
for case in arr_set.values():
res = res + case * (case - 1) // 2
print(res)
AcWing 4405. 统计子矩阵
看的题解,感觉很精妙hhh
n, m, k = map(int, input().split(" "))
in_arr = [list(map(int, input().split(" "))) for _ in range(0, n)]
arr = [[0 for _ in range(0, m + 1)] for _ in range(0, n + 1)]
# 构造前缀和,按照列构造
for i in range(1, n + 1):
for j in range(1, m + 1):
arr[i][j] = in_arr[i - 1][j - 1] + arr[i - 1][j]
res = 0
# 求解
for i in range(1, n + 1):
for j in range(i, n + 1):
l = 1
sum = 0
for r in range(1, m + 1):
sum += arr[j][r] - arr[i - 1][r]
while sum > k:
sum -= arr[j][l] - arr[i - 1][l]
l += 1
res += r - l + 1
print(res)
1236. 递增三元组
n = int(input())
arr = [list(map(int, input().split(" "))) for _ in range(0, 3)]
for i in arr:
i.sort(reverse=True)
a, b, c = arr
count = [0 for _ in range(0, n)]
k = 0
j = 0
# 统计b中各元素比c大的个数
while not (j == n or k == n):
if b[j] >= c[k]:
count[j] = k
j += 1
else:
k += 1
if k == n:
for ii in range(j, n):
count[ii] = k
# 前缀和构造
for i in range(1, n):
count[i] = count[i - 1] + count[i]
count = [0]+count
# 同上,判断a,b关系,得出结果
i, j = 0, 0
res = 0
while not (i == n or j == n):
if a[i] >= b[j]:
res += count[j]
i += 1
else:
j += 1
if j == n:
t = count[-1]
res += (n - i) * t
print(res)