[蓝桥杯 2025 省 Python B] 异或和
暴力(O(n^2)):
def xor_sum(n, arr):total = 0for i in range(n):for j in range(i + 1, n):total += (arr[i] ^ arr[j]) * (j - i)return total# 主函数
if __name__ == "__main__":n = int(input())arr = list(map(int, input().split()))print(xor_sum(n, arr))
只能通过部分示例
单独处理 k,前缀和优化“(j - i)”:
大规模数据(按位分治 + 前缀和优化), 根据全部测试用例的提示:
对于所有评测用例,1 ≤ n ≤ 10**5 ,1 ≤ ai ≤ 2**20
必须将复杂度优化到 O(n log A) ≈ O(n * 20) -- A ≈ 2²⁰def xor_weighted_sum(n, a):MAX_BITS = 20ans = 0for k in range(MAX_BITS): # 遍历每一位(最多 20 位)cnt_0 = 0cnt_1 = 0pos_sum_0 = 0pos_sum_1 = 0for i in range(n):bit = (a[i] >> k) & 1if bit == 0:# 当前是0,贡献 = 前面所有为1的位置之和 - (数量 * 当前索引)contrib = cnt_1 * i - pos_sum_1else:# 当前是1,贡献 = 前面所有为0的位置之和 - (数量 * 当前索引)contrib = cnt_0 * i - pos_sum_0ans += contrib << k # 每一位贡献乘上 2^k# 更新状态if bit == 0:cnt_0 += 1pos_sum_0 += ielse:cnt_1 += 1pos_sum_1 += ireturn ans# 主程序
if __name__ == "__main__":n = int(input())a = list(map(int, input().split()))print(xor_weighted_sum(n, a))