1. 题目解析:ABC344 C题"A+B+C"
这道题目要求我们处理三个数组A、B、C,然后对于查询数组X中的每个元素X_i,判断是否能从A、B、C中各选一个元素使它们的和等于X_i。题目给出的数据范围非常关键:
- 数组A/B/C的长度N/M/L ≤ 100
- 查询次数Q ≤ 2×10^5
1.1 暴力解法的时间复杂度分析
最直观的解法是三重循环遍历所有可能的组合:
python复制for x in X:
found = False
for a in A:
for b in B:
for c in C:
if a + b + c == x:
found = True
break
if found: break
if found: break
print("Yes" if found else "No")
这种解法的时间复杂度是O(Q×N×M×L),在最坏情况下会达到2×10^5×100×100×100=2×10^11次操作,显然会超时。
1.2 优化思路:预处理所有可能的和
观察到N/M/L都很小(≤100),我们可以预先计算出所有可能的a+b+c的组合,存入哈希表中。这样预处理的时间是O(N×M×L)=1,000,000次操作,之后每个查询只需要O(1)时间查询哈希表,总时间复杂度降为O(N×M×L + Q),完全在可接受范围内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 具体实现方案
2.1 使用Python的集合(set)实现
python复制def solve():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx])
idx += 1
A = list(map(int, data[idx:idx+N]))
idx += N
M = int(data[idx])
idx += 1
B = list(map(int, data[idx:idx+M]))
idx += M
L = int(data[idx])
idx += 1
C = list(map(int, data[idx:idx+L]))
idx += L
Q = int(data[idx])
idx += 1
X = list(map(int, data[idx:idx+Q]))
# 预处理所有可能的和
sums = set()
for a in A
