目次
はじめに
この記事では、ABC346のC問題を解説していきます。
ABC(AtCoder Beginner Contest)とは、AtCoderが開催している、競技プログラミングコンテストです。
ABC346 C – Σ
問題
長さNの正整数列Aと、整数Kが与えられます。1以上K以下の整数のうち、Aの中に一度も現れないものの総和を求める問題です。
制約
- \(1 \leqq N \leqq 2×10^5 \)
- \(1 \leqq K \leqq 2×10^9 \)
- \(1 \leqq A_i \leqq 2×10^9 \)
思考の筋道
\(1 \leqq K \leqq 2×10^9 \) なので、Kに関するループを回すとTLEになります。
そこで、1〜K全体の総和からAに現れた数を引くことを考えましょう。全体の総和は、等差数列の和の公式((初項+末項)×項数÷2)で求められます。
この方法であれば、Aに関するループなので時間内に解くことができます。
制約を見て、Kに関するループは回せないので、Aのループで攻めるしかなさそうと考えられるようになるとよいでしょう。
コード
N, K = map(int, input().split())
A = set(map(int, input().split()))
sum = K * (K + 1) // 2
for num in A:
if num <= K:
sum -= num
print(sum)
以上、ABC346のC問題の解説でした!
では、またね。
コメントを書く