AIZU ONLINE JUDGE

AOJ ITP2 4_A(Reverse)を解く

AOJ_ITP2_4_A

Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の4_A問題をC++で解いてみました。

ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#4では、列に対する変更を学びます。

#3から#6は、alogrithm をインクルードして利用する機能を紹介します。全てのアルゴリズムは、データ構造の実装から切り離されています。アルゴリズムの要件(主にイテレータ)を満たせば動作します。

問題(4_A: Reverse)

問題はリンク先をご覧ください。

AOJ ITP2 4_A問題: Reverse

要素の並びを逆にする reverse について学びます。

std::reverse について

以下は、cpprefjp 様の記事を参考にさせていただきました。

std::reverse は、指定された範囲の要素の並びを逆にします。

  template <class BidirectionalIterator>
  void reverse(BidirectionalIterator first, BidirectionalIterator last);

具体的には、0 以上 (last – first) / 2 未満の整数 i について、first + i と (last – i) – 1 を入れ替えます。正確に (last – first) / 2 回の swap を行います。

C++ プログラム例(ITP2 4_A)

    配列 A が与えられて、q 個の操作が与えられます。1回の操作で指定された範囲の reverse を行います(21行目)。最後に A を出力します。

    以下は、C++のプログラムです。

    #include <iostream>
    #include <algorithm>
    
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	int n;
    	cin >> n;
    	vector<int> a(n);
    	for (int i = 0; i < n; ++i) {
    		cin >> a[i];
    	}
    	int q;
    	cin >> q;
    	for (int i = 0; i < q; ++i) {
    		int b, e;
    		cin >> b >> e;
    		reverse(a.begin() + b, a.begin() + e);
    	}
    
    	for (int i = 0; i < n; i++) {
    		cout << a[i] << " \n"[i == n - 1];
    	}
    
    	return 0;
    }

    上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。

    最後に

    reverse は、競技プログラミングでも使っていました。多くの場合、コンテナの最初から最後までを入れ替えています。reverse(a.begin(), a.end()); の形となります。

    引き続き、ITP2 の問題を紹介していきます。

    COMMENT

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    CAPTCHA