设置一个vip隐私,夹杂一些碎碎念......涉及到一些转自其他佬的题解
🚩flag为留存,等技术强硬再钻一把......
***前缀差分***
2024.3.24
54.求和
这题直接会超时(50%,可能是初次代码中每次都需要多次重复计算。下位前缀和题解
n = int(input())
a = [0]+[int(i) for i in input().split()] #读入a[1]~a[n]。a[0]不用
sum = [0] * (n+1) #定义前缀和
sum[1] = 0
for i in range(1,n): sum[i] = a[i]+sum[i-1] #预计算前缀和sum[1]~sum[n-1]
s = 0
for i in range(1,n): s += sum[i]*a[i+1] #计算和s
print(s)
类似的方法自己尝试了下,只不过换成了后缀和100%
import os
import sys
# 请在此输入您的代码
n = int(input())
s = [0] + list(map(int,input().split()))
ss = [sum(s)] * (n+1)
for i in range(1,n+1):
ss[i] = ss[i-1]-s[i]
summ = 0
for i in range(1,n):
summ += ss[i] * s[i]
print(summ)
55.可获得的最小取值
依然是前缀和,但是只有50%,下为题解
n, k = map(int, input().split())
b = list(map(int, input().split()))
a=[0] + sorted(b) # a[0]不用,从a[1]开始
s = [0] * (n+1)
for i in range(1, n+1): s[i] = s[i-1] + a[i]
ans = 10**18
for p in range(1, k+1):
ans = min(s[n] - s[n+p-k] + s[2*p], ans)
print(ans)
2024.3.25
56.异或和之和
最终50%超时超内存
import os
import sys
n = int(input())
a = [int(x) for x in input().split()]
ans = 0
for k in range(21): # 所有a不超过20位
zero, one = 1, 0 # 统计第k位的0和1的数量
cnt, sum = 0, 0 #cnt用于统计第k位有多少对si⊕sj =1
for i in range(n):
v = (a[i] >> k) & 1 # 取a[i]的第k位
sum ^= v # 对所有a[i]的第k位做异或得到sum,sum等于0或者1
if sum == 0: # 前缀和为0
zero += 1 # 0的数量加1
cnt += one # 这次sum=0,这个sum跟前面等于1的sum异或得1
else: # 前缀异或为1
one += 1 # 1的数量加1
cnt += zero # 这次sum=1,这个sum跟前面等于0的sum异或得1
ans += cnt * (1 << k) # 第k位的异或和相加
print(ans)
<