sky’s 雑記

主にAndroidとサーバーサイドの技術について記事を書きます

ABC 111 C - /\/\/\/

atcoder.jp

cpp力の無さで解けず、 解法わかってるのにコードに起こせないのは凹む。

初手の方針

inputを偶奇で分けてそれぞれ頻度の高いものを比較して差分を出力すればいけそうかなと思った。 が、それをどう書いていいかがわからなかった。

vector<ll> v;

REP(i, n) {
  ll a;
  cin >> a;
  v[a]++;
}

vector<pair<ll, ll>> v;

REP(i, n) {
  ll a;
  cin >> a;
  v.push_back(make_pair(a, 1));
}

のようなことをやっていたんだが前者についてはa基準でvectorをsortする方法がわからず、 後者についてはpairのaをfindしてincrementする方法がわからず頓挫した。

苦し紛れでvectorの各要素についてcountをしたがcountの計算量がlast-firstなので10^ 5*10^ 5でLTE

Submission #9346212 - AtCoder Beginner Contest 111

正答

vectorにkeyを配列の値,valueに値の出現数のpairをpushしてsortする。

Submission #9429873 - AtCoder Regular Contest 103

シンタックスを知っているとどうということはないんだが初出の記法は以下の2つ

降順ソートする際に使った。sort(epv.rbegin(), epv.rend()) の部分。sort(epv.begin(), epv.end(), greater<pair<ll, ll>>()) と同義。

  • 範囲for文

コンテナクラスに対してfor文を回すシンタックスC++11から追加された記法らしい。 kotlinでコレクションに対してforEachを回すのと同じ感覚でかけて便利そう。

C++ コンテナ クラス入門