頭良くなりたい人

文系大学生shadeのブログです。競技プログラミングや人文学の話題,受験ネタなど。

ABC142 C - Go to School

問題はこちら
atcoder.jp

方針

問題文を読むと,出席番号 i 番の生徒は A_i 番目に登校したことが分かります。つまりこれを変換して,A_i 番目に登校した生徒の出席番号 B_{A_i} を出力する配列を作れば終わりなのですが,ここで頭が混乱してしまいました。

ということでC++のレファレンスを調べていると,vector<pair>で2要素をペアにして扱えるらしいことが分かったので,そちらを使って実装しています。firstに A_i,secondに i の情報が入っています。この状態でsortすると,firstが小さい順 \rightarrow secondが小さい順でソートされます。

なお,AtCoder解説PDFでは,最初に示した方法が華麗に実装されています。ちょっと悔しいですがvector<pair>を初めて使って勉強になった,ということで納得しておきます。

コード

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;

    vector<pair<int,int>> a(n);     
    
    for(int i=0; i<n; i++){
        cin>>a[i].first;
        a[i].second=i;
    }

    sort(a.begin(),a.end());

    for(int i=0; i<n; i++){
        cout<<a[i].second+1<<" ";
    }

    cout<<endl;
}