D - Append 解説 by MMNMM

すこし実装が簡単になる C++ の文法

C++ において、ランダムアクセスイテレータ(vectorstring.begin() .end() などがその例です)は配列のように添字によるアクセスを使って要素を参照することができます。

負の値を使ってアクセスすることでそのイテレータの \(k\) 個前の要素を参照することができるため、\(2\) 番目のクエリでは .end() が返すイテレータに対して \(x\) 個前の要素を出力することでこの問題を解くことができます。

実装例は以下のようになります。 A.end() の値を使い回すと、再確保が起こった場合にイテレータが無効になることに注意してください(実装例のように毎回 A.end() を呼び出すか、事前に十分な領域を確保することで防ぐことができます)。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    unsigned Q;
    cin >> Q;

    vector<unsigned> A; 
    for (unsigned i = 0; i < Q; ++i) {
        unsigned type;
        cin >> type;
        if (type == 1) { // 1 種類目のクエリでは
            unsigned value;
            cin >> value;
            A.emplace_back(value); // A の末尾に値を追加
        } else { // 2 種類目のクエリでは
            int value;
            cin >> value;
            cout << A.end()[-value] << endl; // A の後ろから value 番目の値を出力
        }
    }
    
    return 0;
}

投稿日時:
最終更新: