set
を使おう!
問題概要
長さ の整数列 と、正の整数 が与えられる。
以上 以下の整数のうち、数列 に一度も含まれないものについての総和を求めよ。
制約
考えたこと
まず、 となる。
この値から「1 以上 以下の整数のうち、数列 に一度以上含まれるもの」の総和を引くことにしよう。
さて、この「1 以上 以下の整数のうち、数列 に含まれる整数」をすべて求めるためには、集合型(set
型)を活用するのがよいだろう。
C++ の set
型の変数 S
に対して、整数 x
を挿入する操作は
S.insert(x);
と書ける。重複は自動的に除外してくれる!!! 数列 に含まれる整数のうち 以上 以下であるものをすべて S
に挿入しよう。
そして、集合 S
に含まれる要素を順に調べていき、その総和を求めればよい。そのような操作は次のように書ける。
long long sub = 0; for (auto x : S) sub += x;
最後に計算量を見積もる。集合 S
に要素 x
を挿入する処理の計算量は である。それを高々 回実行するので、計算量は となる。
コード
#include <bits/stdc++.h> using namespace std; int main() { long long N, K, A; cin >> N >> K; set<long long> S; for (int i = 0; i < N; i++) { cin >> A; if (A <= K) S.insert(A); } long long all = K * (K + 1) / 2, sub = 0; for (auto x : S) sub += x; cout << all - sub << endl; }