1. 题目解析:ABC344 C题"A+B+C"核心逻辑
这道题目要求我们处理三个数组A、B、C,对于给定的查询数组X中的每个元素X_i,判断是否存在a∈A、b∈B、c∈C使得a+b+c=X_i。乍看简单,但数据规模暗藏玄机:
- 数组A/B/C长度N/M/L ≤ 100
- 查询次数Q ≤ 2×10^5
- 每个查询需要在O(1)时间内响应
直接三重循环暴力枚举的O(NML)预处理+O(Q)查询的方式,在NML=1e6时勉强可行,但实际测试会TLE(Time Limit Exceeded)。更优解法是:
- 预处理所有可能的A+B结果(O(NM)时间)
- 将A+B的结果存入哈希表(O(1)查询)
- 对于每个X_i,检查是否存在c∈C使得X_i - c存在于哈希表中(O(L) per query)
但查询次数Q=2e5时,O(LQ)仍可能超时。因此需要进一步优化:
cpp复制#include <bits/stdc++.h>
using namespace std;
int main() {
// 输入处理
int N, M, L;
cin >> N;
vector<int> A(N);
for(auto &a : A) cin >> a;
cin >> M;
vector<int> B(M);
for(auto &b : B) cin >> b;
cin >> L;
vector<int> C(L);
for(auto &c : C) cin >> c;
// 预处理A+B的所有可能
unordered_set<int> AB;
for(int a : A) {
for(int b : B) {
AB.insert(a + b);
}
}
// 处理查询
int Q;
cin >> Q;
while(Q--) {
int X;
cin >> X;
bool found = false;
for(int c : C) {
