「変数を固定する考え方」と「set
の活用」を組み合わせる練習問題!
問題概要
整数 と、
個の整数
が与えられる。
を満たす [tex i, j] ( でもよい) が存在するかを判定せよ。
制約
考えたこと
この問題のように、 という 2 つの変数を考える必要のある問題では、一方を固定すると良いことが多い!
ここでは、 を固定してみよう(
を固定しても解ける)。そうすると、次のような問題となる。
を満たすような が存在するかどうかを判定せよ。
これは、整数 を格納した集合(C++ ならば
set
型)を用意しておけば、
「集合に が含まれているかどうかを判定する」
ことによって解ける。この判定の計算量は であるため、
に対して判定すると、判定全体の計算量は
となる。
また、集合を作る部分についても、1 つ 1 つの要素を挿入するのに の計算量を要することから、集合を作る部分全体の計算量も
となる。
以上より、全体を通して、 の計算量の解法が得られた。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N, X; cin >> N >> X; vector<int> A(N); set<int> S; for (int i = 0; i < N; i++) { cin >> A[i]; S.insert(A[i]); } // i を固定して判定 for (int i = 0; i < N; i++) { if (S.count(A[i] - X)) { cout << "Yes" << endl; return 0; } } cout << "No" << endl; }