おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Beginner Contest 022 B - Bumble Bee

問題

問題文へ

N個の花があります。i番目に訪れた花はA_iです。i>jかつ{A_i == A_j}である花の個数を求めます。

制約

  • {1 \leqq N \leqq 10^5}
  • {1 \leqq A_i \leqq 10^5}

考えたこと

1番目から順番に、花の種類であるA_iの値を補完するとともに、すでに保管しているかを調べます。

コード

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  int N;
  cin >> N;
  vector<int> A(N);
  rep(i, N) cin >> A[i];

  unordered_map<int, int> mp;
  int ans = 0;
  for (int i = 0; i < N; ++i) {
    auto itr = mp.find(A[i]);
    if (itr != mp.end()) {
      ++ans;
    }
    mp.insert(make_pair(A[i], 1));
  }

  cout << ans << endl;
  
  return 0;
}

解説を読んで

花の種類数という考え方の方が、よく考えられている気がします。