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: