【C++】uniqueによる重複除去はvectorのサイズを変更しないので注意 abc085_b

Quiz

Submit

解法

  • sortしてuniqueしてsize取ればOK、と思いきや
  • ゴミがvectorの後端に残るのでeraseが必要
    • uniqueがゴミの先端を返してくれるのでそれを用いてeraseする
    sort(ALL(A));
    auto it = unique(ALL(A));
    A.erase(it, A.end());
    p(A.size());

unique時の動作

    VI A = {1,1,2,2,3,3,3};
    unique(ALL(A));
    debug(A);
// 出力
[A]: {1, 2, 3, 2, 3, 3, 3}
  • 重複しないように前に寄せて、後端は残りがてきとうに並ぶわけではなく、どんな値が入っていても文句を言うなという印象(1が1つしかない)
  • そもそもuniqueとるならset使えということでしょう

追記:2020/10/19

int main(){
    // input
    ll N; 
    cin>>N;
    
    set<ll> se;
    rep(i,N){
      ll a;cin>>a;
      se.insert(a);
    }
    ll ans = se.size();
    p(ans);
    
    return 0;
}