zuka
ABCをコツコツ解いていきます。
本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。
これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。
目次
本記事の概要
Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC113-C「ID」です。
ポイント
ポイントは3つです。1つ目は,情報を保持するためのデータ構造の決め方です。2つ目は,年に関するソートの方法とインデックスの取得方法です。3つ目は,0埋めの方法です。
今回得られる情報は各市$i$に対して属する「県」と誕生した「年」です。そして,求められていることは,各県に対して「年」を昇順にソートするという問題です。まずは,出力のために「県」と「年」を別々の配列に保持します。加えて,各県に対して同じ県に属する市の誕生年を保持する二次元配列を用意すればOKです。
次に,年に関するソートの方法ですが,これはsort
関数に適切な軸のイテレータを指定してあげればOKです。ソートされた配列から指定の要素のインデックスを取得する方法には,以下のような方法があります。
argmin(argmax)の実現方法
- ソートされていない配列に対して
min_element
を利用して最小要素インデックスのイテレータを取得後,先頭要素のイテレータとの距離を測る - ソートされている配列に対して
lower_bound
を利用して最小要素インデックスのイテレータを取得後,先頭要素のイテレータとの距離を測る
今回の配列はソートされていますので,lower_bound
を利用できます。
最後に,0埋めの方法です。これは,出力の際に0埋めの桁数を指定する方法が最もシンプルです。具体的には,以下のようなマクロを利用することができます。
#define zero_pad(num) setfill('0') << right << setw(num)
cout << zero_pad(6) << 24 < endl; // 000024と出力される
おさえるべき内容
情報を保持するためのデータ構造の決め方
年に関するソートの方法とインデックスの取得方法
0埋めの方法
実装
#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;
typedef long long ll;
#define zero_pad(num) setfill('0') << right << setw(num)
int main(){
int N, M;
cin >> N >> M;
vector<ll> P(M);
vector<ll> Y(M);
// 県と年を一緒に管理するvector
vector<vector<ll>> X(N);
rep(i, M){
cin >> P[i] >> Y[i];
// 一旦県は0インデックスに直す(直さないでvectorの長さをN+1にしてもO)
P[i]--;
// Xの1次元目に県,2次元目に年を格納していく
X[P[i]].push_back(Y[i]);
}
// 年に関してソートしていく
rep(i, N){
sort(X[i].begin(), X[i].end());
}
rep(i, M){
// 上6桁。1インデックスに直す。
ll upper = P[i] + 1;
// 下6桁。lower_boundを使って調べている要素のイテレータを取得して先頭のイテレータとの距離を測り,1インデックスに直す
ll lower = lower_bound(X[P[i]].begin(), X[P[i]].end(), Y[i]) - X[P[i]].begin() + 1;
// zero_padを利用して0パディングを施す
cout << zero_pad(6) << upper << zero_pad(6) << lower << endl;
}
}
コメント