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; }