公式
A - 図鑑コンプリート / Encyclopedia Completion 解説 by admin
Qwen3-Coder-480B概要
与えられた花の品種番号のリストから、初めて出現した品種のみを選んでその個数と合計を求める問題。
考察
この問題では、各品種番号について「すでに見たことがあるか」を効率よく管理する必要があります。
例えば、花の品種番号が [1, 3, 1, 2, 3] のように与えられたとき、図鑑に載せるのは「最初に登場した品種」である [1, 3, 2] です。
このとき、枚数は \(3\) 枚、合計は \(1 + 3 + 2 = 6\) となります。
素朴な方法として、「今見ている花の品種が、それ以前に出現しているか」を毎回調べるという方法があります。しかし、これは最悪の場合、各要素に対して過去すべての要素を確認する必要があり、時間計算量が \(O(N^2)\) になってしまいます。制約では \(N\) が最大で \(2 \times 10^5\) なので、これでは間に合いません(TLE)。
そこで、各品種が「すでに見たことがあるか」を高速に判定する方法が必要になります。このために使えるのが 集合(set) です。集合は要素の存在確認や追加が平均的に \(O(1)\) で行えるので非常に効率的です。
アルゴリズム
- 入力として花の品種番号のリストを受け取る。
- 「すでに見た品種」を記録するための集合
seenを用意する。 - 図鑑に載せる花の枚数
countと品種番号の合計totalを初期化する。 - 各花の品種番号に対して以下を行う:
- その品種が
seenに含まれていない場合:seenに追加countを1増やすtotalにその品種番号を加える
- その品種が
- 最後に
countとtotalを出力する。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\) (品種番号の種類数は最大で100なので、setのサイズも定数扱いできる)
実装のポイント
- Pythonの
setを使うことで、要素の存在確認と追加を高速に行う。 - 品種番号の範囲が \(1\) 〜 \(100\) と小さいため、空間計算量も実質的に定数となる。
## ソースコード
```python
N = int(input())
S = list(map(int, input().split()))
seen = set()
count = 0
total = 0
for s in S:
if s not in seen:
seen.add(s)
count += 1
total += s
print(count, total)
この解説は qwen3-coder-480b によって生成されました。