実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 204
問題概要
3個の数列 と、数列 が与えられる。各 について、数列 からそれぞれ1個ずつ要素を選び、和を にできるかどうかを判定せよ。
制約
- 入力は全て整数
考察
の各数列の要素数は 以下なので、 が取り得る値は高々 通りしかない。まずはこれを求めてしまおう。
とはいえ、最大で 個の に対して判定を行う必要があるので、各 についていちいち 通りの探索をしていたのでは間に合わない。
そこで、 C++ では連想コンテナに対してcount
関数を使うことで計算量を抑えることができる ( C++20 ではcontains
も使用可) 。詳しくは
を参照。なお、私のコードではデータ構造としてset
を用いたが、より高速化を狙うならunordered_set
を使うのが良いだろう。
コード
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++) // ======================================== // int main() { int N, M, L, Q; vector<int> A, B, C, X; cin >> N; A.resize(N); rep(i, 0, N) cin >> A[i]; cin >> M; B.resize(M); rep(i, 0, M) cin >> B[i]; cin >> L; C.resize(L); rep(i, 0, L) cin >> C[i]; cin >> Q; X.resize(Q); rep(i, 0, Q) cin >> X[i]; set<int> s; rep(i, 0, N) rep(j, 0, M) rep(k, 0, L) { s.insert(A[i] + B[j] + C[k]); } rep(i, 0, Q) { if (s.count(X[i]) == 0) cout << "No" << endl; else cout << "Yes" << endl; } }
実装時間: 10分