Official
B - Count Distinct Integers Editorial by KoD
解法 1
\(a\) に現れる整数を順番に見ていき、「それが初めて登場した整数なら答えに \(1\) を足す」ことを繰り返せばよいです。
\(a_i\) が初めて登場する整数であるための条件は、全ての \(j < i\) に対し \(a_j \neq a_i\) であることです。これを for 文などを用いて実装することで正解することができます。
最悪計算量は \(\Theta (N^2)\) です。
実装例 (C++) :
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int& x : a) {
cin >> x;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
bool appeared = false;
for (int j = 0; j < i; ++j) {
if (a[i] == a[j]) {
appeared = true;
}
}
if (!appeared) {
ans += 1;
}
}
cout << ans << '\n';
}
実装例 (Python) :
n = int(input())
a = list(map(int, input().split()))
ans = 0
for i in range(n):
appeared = False;
for j in range(i):
if a[i] == a[j]:
appeared = True
if not appeared:
ans += 1
print(ans)
解法 2
(重複のない)集合を管理するデータ構造を用いて解くことができます。C++ では std::set
、Python では set
などを用いることができます。詳しい使い方は公式リファレンス(C++、Python)を参照してください。
最悪計算量は \(\Theta (N \log N)\) です。
実装例 (C++) :
#include <iostream>
#include <set>
using namespace std;
int main() {
int n;
cin >> n;
set<int> a;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
a.insert(x);
}
cout << a.size() << '\n';
}
実装例 (Python) :
n = int(input())
print(len(set(map(int, input().split()))))
解法 3
\(a\) を昇順に並べ替えると、等しい要素は隣り合わせになります。 並べ替えた後の数列において、\(a_i \neq a_{i + 1}\) となる \(i\) の個数に \(1\) を足した値が答えとなります。
最悪計算量は \(\Theta (N \log N)\) です。
実装例 (C++) :
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int& x : a) {
cin >> x;
}
sort(begin(a), end(a));
int ans = 1;
for (int i = 0; i < n - 1; ++i) {
if (a[i] != a[i + 1]) {
ans += 1;
}
}
cout << ans << '\n';
}
実装例 (Python) :
n = int(input())
a = list(map(int, input().split()))
a.sort()
ans = 1
for i in range(n - 1):
if a[i] != a[i + 1]:
ans += 1
print(ans)
posted:
last update: