ABC113-C 「ID」
実装に工夫が必要な問題として認識されているようです。
実際、この問題を解くときに引っかかるポイントは
「県ごとに、市が誕生した順番を整理(座標圧縮)する必要がある」
という点です。
座標圧縮の方法としては
①値をset等で管理⇒sort⇒lower_bound等で値を探索し、イテレータを返す
②値をmapで管理⇒mapは辞書順ソートされるので、forループ等で取り出した順に番号をつけていく(ABC036-C「座圧」)
atcoder.jp
などの方法が考えられそうです。
①については、けんちょんさんの記事
(AtCoder ABC 113 C - ID (300 点) (座標圧縮の教育的練習問題) - けんちょんの競プロ精進記録)で取り上げられており、公式解説も同様です。
↓
int n, m; int p[100000], y[100000]; vector<int> yd[100001]; int main() { scanf("%d%d",&N,&M); rep(i, m) scanf("%d%d", &p[i], &y[i]), yd[p[i]].push_back(y[i]); rep(i, n) sort(yd[i+1].begin(), yd[i+1].end()); //1<=p[i]<=n rep(i, m) printf("%012lld\n", ll(p[i])*1000000+int(lower_bound(yd[p[i]]. begin(), yd[p[i]].end(), y[i])-yd[p[i]].begin())+1); return 0; }
②について、↓のコードのようにmapをvectorで持てば可能です(コードでは0埋めをしていません)。
int main() { ll n,m; cin >> n >> m; vector<ll> y(m); vector<ll> p(m); vector<map<ll,ll>> q(n+1); rep(i,m){ cin >> p[i] >> y[i]; q[p[i]][y[i]]=0; } rep(i,m){ ll j=1; for(auto x:q[p[i]]){ q[p[i]][x.first]=j; j++; } } rep(i,m){ cout << p[i] << q[p[i]][y[i]] << endl; } return 0; }